好的,我有一个包含 gz 文件 (unix gzip) 的 zip 文件。
这就是我所做的——
def parseSTS(file):
import zipfile, re, io, gzip
with zipfile.ZipFile(file, 'r') as zfile:
for name in zfile.namelist():
if re.search(r'\.gz$', name) != None:
zfiledata = zfile.open(name)
print("start for file ", name)
with gzip.open(zfiledata,'r') as gzfile:
print("done opening")
filecontent = gzfile.read()
print("done reading")
print(filecontent)
这给出了以下结果--
>>>
start for file XXXXXX.gz
done opening
done reading
然后永远保持这样,直到崩溃......
我可以使用文件内容
做什么?
编辑:这不是重复的,因为我的 gzip 压缩文件位于压缩文件中,并且我试图避免将该 zip 文件提取到磁盘。它可以按照 How to read from a zip file within zip file in Python? 处理 zip 文件中的 zip 文件。 .
最佳答案
我创建了一个 zip 文件,其中包含从网上获取的经过 gzip 压缩的 PDF 文件。
我运行了这段代码(有两个小改动):
1)修复了 def 语句下所有内容的缩进(我也在您的问题中更正了这一点,因为我确信它对您来说是正确的,否则不会解决您遇到的问题)。
2)我改变了:
zfiledata = zfile.open(name)
print("start for file ", name)
with gzip.open(zfiledata,'r') as gzfile:
print("done opening")
filecontent = gzfile.read()
print("done reading")
print(filecontent)
至:
print("start for file ", name)
with gzip.open(name,'rb') as gzfile:
print("done opening")
filecontent = gzfile.read()
print("done reading")
print(filecontent)
因为您将文件对象而不是字符串传递给 gzip.open。我不知道如果没有这种更改,您的代码将如何执行,但在我修复它之前,它对我来说一直崩溃。
编辑:添加来自 James R 的 GZIP 文档链接的回答--
此外,请参阅此处以获取更多文档:
http://docs.python.org/2/library/gzip.html#examples-of-usage
结束编辑
现在,由于我的 gzip 文件很小,我观察到的行为是在打印 done read
后暂停大约 3 秒,然后输出 filecontent
中的内容>.
我建议在打印“完成阅读”后添加以下调试行 - print len(filecontent)
。如果这个数字非常非常大,请考虑不要一次性打印整个文件内容。
我还建议阅读此内容,以更深入地了解我所期望的您的问题:Why is printing to stdout so slow? Can it be sped up?
编辑 2 - 如果您的系统不处理 zip 文件上的文件 io,则另一种选择,不会导致上述文件错误:
def parseSTS(afile):
import zipfile
import zlib
import gzip
import io
with zipfile.ZipFile(afile, 'r') as archive:
for name in archive.namelist():
if name.endswith('.gz'):
bfn = archive.read(name)
bfi = io.BytesIO(bfn)
g = gzip.GzipFile(fileobj=bfi,mode='rb')
qqq = g.read()
print qqq
parseSTS('t.zip')
关于python - 如何打印压缩的 gzip 文件的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20100079/