Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python解压缓冲区?_Python_Zip_Zlib_Unzip_Zipfile - Fatal编程技术网

用Python解压缓冲区?

用Python解压缓冲区?,python,zip,zlib,unzip,zipfile,Python,Zip,Zlib,Unzip,Zipfile,我有一个从库调用读取的字节缓冲区,我想解压单个文本文件的内容 我尝试使用zlib,但出现以下错误: >>> import zlib >>> zlib.decompress(buffer) error: Error -3 while decompressing data: incorrect header check 但是,使用ZipFile它可以工作,但我必须使用一个临时文件: import zipfile f = open('foo.zip', 'wb')

我有一个从库调用读取的字节缓冲区,我想解压单个文本文件的内容

我尝试使用
zlib
,但出现以下错误:

>>> import zlib
>>> zlib.decompress(buffer)
error: Error -3 while decompressing data: incorrect header check
但是,使用
ZipFile
它可以工作,但我必须使用一个临时文件:

import zipfile
f = open('foo.zip', 'wb')
f.write(buffer)
f.close()
z = ZipFile('foo.zip')
z.extractall()
z.close()
with open('foo.txt', 'r') as f:
    uncompressed_buffer = f.read()
是否可以使用
zlib
以及如何避免使用临时文件

可以使用zlib吗

不,zlib不是设计用来处理ZIP文件的

如何避免使用临时文件

使用
io.BytesIO

import zipfile
import io

buffer = b'PK\x03\x04\n\x00\x00\x00\x00\x00\n\\\x88Gzzo\xed\x03\x00\x00\x00\x03\x00\x00\x00\x07\x00\x1c\x00foo.txtUT\t\x00\x03$\x14gV(\x14gVux\x0b\x00\x01\x041\x04\x00\x00\x041\x04\x00\x00hi\nPK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\n\\\x88Gzzo\xed\x03\x00\x00\x00\x03\x00\x00\x00\x07\x00\x18\x00\x00\x00\x00\x00\x01\x00\x00\x00\xb4\x81\x00\x00\x00\x00foo.txtUT\x05\x00\x03$\x14gVux\x0b\x00\x01\x041\x04\x00\x00\x041\x04\x00\x00PK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00M\x00\x00\x00D\x00\x00\x00\x00\x00'

z = zipfile.ZipFile(io.BytesIO(buffer))

# The following three lines are alternatives. Use one of them
# according to your need:
foo = z.read('foo.txt')        # Reads the data from "foo.txt"
foo2 = z.read(z.infolist()[0]) # Reads the data from the first file
z.extractall()                 # Copies foo.txt to the filesystem

z.close()


print foo
print foo2

您是否尝试过使用BytesIO对象而不是从zlib导入解压缩MAX_WBITS写入光盘
;解压(gz_字节,最多16个字节)
就可以了。另请参见。@bbayles此
不正确的头检查存在同样的问题
@padraiccanningham它没有帮助,因为我必须给
ZipFile
指定一个
文件名,而不是文件指针
zlib
的gzip压缩和
ZipFile
的PKZIP压缩之间有区别。我猜你的是后者?这会将ZIP中的所有文件提取到文件系统中。如果您想从压缩文件中读取数据,请使用
z.open()
z.read()
@Jarad-谢谢。您能在一块“缓冲区”上也这样做吗;也就是说在数据流上?