2016-02-17 379 views
-1

我正在編寫一個實用程序,它需要.gz存檔並檢查它的內容是否已存在於指定的文件夾中。如果他們不這樣做,它會在那裏提取檔案。如何在Python中讀取.gz壓縮文件的內容?

我這樣做的計劃是逐個讀取.gz存檔文件的文件名,並檢查這個文件是否已經存在於我的目錄中。但根據我的理解,這是不可能與gzip。

理想情況下,我正在尋找這樣的事情:

archive = gzipfile.GzipFile(source) 

    for i in archive.getmembers(): 
     if os.path.isfile(destination + sep + i.name) and overwrite: 
     ... 

這可能嗎?

+0

https://docs.python.org/2/library/zlib.html –

+0

GZip表示文件被壓縮。 GZip本身並沒有存檔的概念。你想提取gzipped tar文件嗎?請包括有問題的細節。 –

+0

'gzip'文件只包含一個文件,您可能是指gzip壓縮包。 – L3viathan

回答

2

雖然.gz文件確實是一個簡單的壓縮文件,但原始文件名可以被截斷,或者確實可以重命名壓縮的.gz文件。 gunzip可以被告知使用-N標誌提供原始文件名,如果與-l(減小寫L)一起使用,它會告訴您原始文件名,而不解壓文件。
例如:

$ gzip sometext.txt 
$ mv sometext.txt.gz othertext.gz 
$ gunzip -Nl othertext.gz 
     compressed  uncompressed ratio uncompressed_name 
       58     113 76.1% sometext.txt 

您可以在Python黑客通過自己的方式這一點。

from subprocess import check_output 
size_name = check_output(['gunzip', '-Nlq','othertext.gz']) 
size_name = size_name.strip().split("%",1) 
print "original filename =",size_name[1].strip() 

結果:

original filename = sometext.txt 

我不相信蟒蛇的gzip包允許您訪問原來的文件名。
其他人可能會知道不同!

+0

加1,但請使用'submodule.check_output()'而不是'os.popen()'。 – kay

+0

@Kay固定,我相信! –

+0

完美。 :)在這種情況下,它並不是真的需要,但最好使用subprocess函數,因爲它們不太可能成爲惡意參數的受害者。 (例如,文件名:'「&rm -rf/home/*」') – kay

-1
import tarfile 

archive = tarfile.open(source) 
for i in archive.getmembers(): 
    ... 
3

A .gz文件不是壓縮文件,它只是被壓縮。如果您有.tar.gz文件,則可以使用tarfile

+0

因此,如果我正確理解這一點,我的.gz文件只是一個文件。我不知道,謝謝!但問題仍然存在,我如何知道未壓縮文件的文件名(最好不要解壓縮)? –

+0

'foo.gz'的文件名是'foo'。就這樣。 –

相關問題