2016-02-17 378 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'。就这样。 –

相关问题