Python 如何打印压缩gzip的内容';d文件

Python 如何打印压缩gzip的内容';d文件,python,gzip,zipfile,Python,Gzip,Zipfile,好的,我有一个包含gz文件的zip文件(unixgzip) 我就是这么做的-- 这将得到以下结果-- 然后一直这样直到它崩溃 如何处理filecontent 编辑:这不是重复的,因为我的压缩文件在压缩文件中,我试图避免将压缩文件解压缩到磁盘。它可以使用zip文件中的zip文件,如所示。我创建了一个zip文件,其中包含我从web上抓取的gzip格式的PDF文件 我运行了这段代码(有两个小改动): 1) 修正了def语句下所有内容的缩进(我在您的问题中也纠正了这一点,因为我确信它在您这边是正确的,否

好的,我有一个包含gz文件的zip文件(unixgzip)

我就是这么做的--

这将得到以下结果--

然后一直这样直到它崩溃

如何处理
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中运行它,