3

我基本上想完全按照以下文档中的内容进行操作gzip.GzipFile

调用 GzipFile 对象的 close() 方法不会关闭 fileobj,因为您可能希望在压缩数据之后附加更多材料。这也允许您传递一个为写入而打开的 io.BytesIO 对象作为 fileobj,并使用 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()

4

1 回答 1

6

是的,您需要将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只会查看文件模式的第一个字符。

于 2015-09-26T07:59:53.280 回答