Python 如何打印压缩gzip的内容';d文件
好的,我有一个包含gz文件的zip文件(unixgzip) 我就是这么做的-- 这将得到以下结果-- 然后一直这样直到它崩溃 如何处理Python 如何打印压缩gzip的内容';d文件,python,gzip,zipfile,Python,Gzip,Zipfile,好的,我有一个包含gz文件的zip文件(unixgzip) 我就是这么做的-- 这将得到以下结果-- 然后一直这样直到它崩溃 如何处理filecontent 编辑:这不是重复的,因为我的压缩文件在压缩文件中,我试图避免将压缩文件解压缩到磁盘。它可以使用zip文件中的zip文件,如所示。我创建了一个zip文件,其中包含我从web上抓取的gzip格式的PDF文件 我运行了这段代码(有两个小改动): 1) 修正了def语句下所有内容的缩进(我在您的问题中也纠正了这一点,因为我确信它在您这边是正确的,否
filecontent
编辑:这不是重复的,因为我的压缩文件在压缩文件中,我试图避免将压缩文件解压缩到磁盘。它可以使用zip文件中的zip文件,如所示。我创建了一个zip文件,其中包含我从web上抓取的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)
致:
因为您将文件对象传递给gzip.open,而不是字符串。我不知道你的代码在没有更改的情况下是如何执行的,但在我修复它之前,它一直在崩溃
编辑:添加来自的GZIP文档的链接的答案--
此外,有关更多文档,请参见此处:
结束编辑
现在,由于我的gzip文件很小,我观察到的行为是在打印done reading
后暂停大约3秒钟,然后输出filecontent
中的内容
我建议在打印“完成阅读”后添加以下调试行--print len(filecontent)
。如果这个数字非常大,考虑不要一次打印整个文件内容。
我还建议您阅读本文,以便更深入地了解您的问题:
编辑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')
我创建了一个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)
致:
因为您将文件对象传递给gzip.open,而不是字符串。我不知道你的代码在没有更改的情况下是如何执行的,但在我修复它之前,它一直在崩溃
编辑:添加来自的GZIP文档的链接的答案--
此外,有关更多文档,请参见此处:
结束编辑
现在,由于我的gzip文件很小,我观察到的行为是在打印done reading
后暂停大约3秒钟,然后输出filecontent
中的内容
我建议在打印“完成阅读”后添加以下调试行--print len(filecontent)
。如果这个数字非常大,考虑不要一次打印整个文件内容。
我还建议您阅读本文,以便更深入地了解您的问题:
编辑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')
最有可能的问题在于:
if name.endswith(".gz"): #as goncalopp said in the comments, use endswith
#zfiledata = zfile.open(name) #don't do this
#print("start for file ", name)
with gzip.open(name,'rb') as gzfile: #gz compressed files should be read in binary and gzip opens the files directly
#print("done opening") #trust in your program, luke
filecontent = gzfile.read()
#print("done reading")
print(filecontent)
有关更多文档,请参见此处:
最有可能的问题在于:
if name.endswith(".gz"): #as goncalopp said in the comments, use endswith
#zfiledata = zfile.open(name) #don't do this
#print("start for file ", name)
with gzip.open(name,'rb') as gzfile: #gz compressed files should be read in binary and gzip opens the files directly
#print("done opening") #trust in your program, luke
filecontent = gzfile.read()
#print("done reading")
print(filecontent)
有关更多文档,请参见此处:
它在哪里崩溃?你能给我们一个堆栈跟踪吗?另外,你应该使用
name.endswith(“.gz”)
而不是re.search(r'\.gz$”,name)
。使用正则表达式就是在读取文件时使用“rb”而不是“r”用大象枪射击鼠标。@goncalopp:tru-dat!我会改正的!更改为rb不会改变pythonshell暂停并进入“无响应”状态的任何内容。如何获取堆栈跟踪?我可以破坏它吗?我可以提取所有内容,然后打开,然后删除文件,但我更喜欢在内存中完成。它在哪里崩溃?你能给我们一个堆栈跟踪吗?另外,你应该使用name.endswith(“.gz”)
而不是re.search(r'\.gz$”,name)
。使用正则表达式就是在读取文件时使用“rb”而不是“r”用大象枪射击鼠标。@goncalopp:tru-dat!我会改正的!更改为rb不会改变pythonshell暂停并进入“无响应”状态的任何内容。如何获取堆栈跟踪?我可以破解它吗?我可以解压所有内容,然后打开,然后删除文件,但我更喜欢在内存中完成。如果OP正在执行问题中的代码,那么到底如何才能不引发TypeError?它不应该像这样运行,除非不知何故,奇怪的是,file对象的计算结果是一个字符串,而这个字符串又是一个有效的文件名?@selllikesybok你是说他传入一个打开的文件?老实说,我真的不知道。我只测试了上面的内容(请注意,在Python2.7中,他在3.x中运行)。不管怎样,看起来我们得出了大致相同的答案。如果您将gzip文档添加到您的文档中,我将收回我的真实版本,我也在2.7中运行此版本,那么3.x中的gzip可能存在一个奇怪的问题?无论如何,我已经在我的回答中添加了链接,并向您点头表示感谢。@zlr您是否尝试过使用StringBuffer?在这种情况下,它是一个类似文件的对象。提取到它,然后传递到gzip?因此根据@selllikesybok-answer的使用io.BytesIO
(类似于StringBuffer)确实可以使它工作:)如果OP正在执行问题中的代码,那么到底是如何不产生类型错误的?它不应该像这样运行,除非不知何故,奇怪的是,file对象的计算结果是一个字符串,而这个字符串又是一个有效的文件名?@selllikesybok你是说他传入一个打开的文件?老实说,我真的不知道。我只测试了上面的内容(请注意,在Python2.7中,他在3.x中运行)。不管怎样,看起来我们得出了大致相同的答案。如果你把gzip文档添加到你的文档中,我会收回我的真实版本,我也在2.7中运行它,