我基本上想在gzip.GzipFile
:
调用GzipFile对象的close()方法不会关闭fileobj,因为您可能希望在压缩数据之后附加更多材料。这也允许您传递为文件写入而打开的io.BytesIO对象,并使用io.BytesIO对象的getvalue()方法检索生成的内存缓冲区。
使用普通文件对象,它可以按预期工作。
>>> import gzip
>>> fileobj = open("test", "wb")
>>> fileobj.writable()
True
>>> gzipfile = gzip.GzipFile(fileobj=fileobj)
>>> gzipfile.writable()
True
但是在传递gzip.GzipFile
对象时,我无法设法获取可写的io.BytesIO
对象。
>>> import io
>>> bytesbuffer = io.BytesIO()
>>> bytesbuffer.writable()
True
>>> gzipfile = gzip.GzipFile(fileobj=bytesbuffer)
>>> gzipfile.writable()
False
我是否必须打开io.BytesIO
明确写作,我该怎么做?或者open(filename, "wb")
返回的文件对象与我认为没有的io.BytesIO()
返回的对象之间有区别吗?
答案 0 :(得分:2)
是的,您需要明确将GzipFile
模式设置为'w'
;否则它会尝试从文件对象中获取模式,但BytesIO
对象没有.mode
属性:
>>> import io
>>> io.BytesIO().mode
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: '_io.BytesIO' object has no attribute 'mode'
只需明确指定模式:
gzipfile = gzip.GzipFile(fileobj=fileobj, mode='w')
演示:
>>> import gzip
>>> gzip.GzipFile(fileobj=io.BytesIO(), mode='w').writable()
True
原则上,BytesIO
对象以'w+b'
模式打开,但GzipFile
只会查看文件模式的第一个字符。