通过io.将BytesIO对象压缩为gzip.并写入GzipFile



我基本上想做的就是gzip.GzipFile的文档:

调用GzipFile对象的close()方法不会关闭fileobj,因为您可能希望在压缩数据之后附加更多的材料。这也允许您传递io。作为fileobj打开用于写入的BytesIO对象,并使用io. js方法检索生成的内存缓冲区。BytesIO对象的getvalue()方法

对于一个正常的文件对象,它按预期工作。

>>> import gzip
>>> fileobj = open("test", "wb")
>>> fileobj.writable()
True
>>> gzipfile = gzip.GzipFile(fileobj=fileobj)
>>> gzipfile.writable()
True

但是当传递一个io.BytesIO对象时,我不能设法获得一个可写的gzip.GzipFile对象。

>>> import io
>>> bytesbuffer = io.BytesIO()
>>> bytesbuffer.writable()
True
>>> gzipfile = gzip.GzipFile(fileobj=bytesbuffer)
>>> gzipfile.writable()
False

我必须打开io.BytesIO显式写作吗,我该怎么做?或者open(filename, "wb")返回的文件对象和io.BytesIO()返回的对象之间存在差异,我没有想到?

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

最新更新