gpt4 book ai didi

Python:模式 'wt' 中的 bz2 和 lzma 不编写 BOM(而 gzip 编写)。为什么?

转载 作者:行者123 更新时间:2023-11-28 18:58:44 25 4
gpt4 key购买 nike

以下代码使用 gzip、bz2 和 lzma 写入压缩文本文件,然后读取并打印其二进制内容。

import bz2
import gzip
import lzma
import os


def test(encoding):
print(encoding)
for module in [gzip, bz2, lzma]:

path = '/tmp/test.txt.%s' % module.__name__
if os.path.exists(path):
os.remove(path)

with module.open(path, 'wt', encoding=encoding) as fout:
fout.write('Ciao')

with module.open(path, 'rb') as fin:
print("%8s" % module.__name__, 'bytes:', fin.read())


test('utf-16')
print('')
test('utf-32')

输出是:

utf-16
gzip bytes: b'\xff\xfeC\x00i\x00a\x00o\x00'
bz2 bytes: b'C\x00i\x00a\x00o\x00'
lzma bytes: b'C\x00i\x00a\x00o\x00'

utf-32
gzip bytes: b'\xff\xfe\x00\x00C\x00\x00\x00i\x00\x00\x00a\x00\x00\x00o\x00\x00\x00'
bz2 bytes: b'C\x00\x00\x00i\x00\x00\x00a\x00\x00\x00o\x00\x00\x00'
lzma bytes: b'C\x00\x00\x00i\x00\x00\x00a\x00\x00\x00o\x00\x00\x00'

如您所见,bz2 和 lzma 不写 BOM(字节顺序标记),而 gzip 按预期写。这意味着如果我尝试以文本模式读取 bz2/lzma 文件(例如 bz2.open(path, 'rt', encoding='utf-16')),UnicodeError 引发对缺少 BOM 的提示。

这是为什么呢?是错误吗?

最佳答案

我正在回答我自己的问题。简而言之:是的,这绝对是 io.TextIOWrapper 的 C 实现的一个错误。

当您以文本模式(压缩或非压缩)打开文件时,返回的是一个包装了二进制文件阅读器的 io.TextIOWrapperio.TextIOWrapper_io 扩展模块中用 C 实现。原来还有io模块的Python实现,即_pyio模块。 _pyio.TextIOWrapper 按预期工作,因此它绝对是 C 实现的错误。

下面的代码演示了这个问题:

import bz2
import io
import _pyio

def test(io_module, encoding='utf-16'):
path = '/tmp/test.txt.bz2'

with io_module.TextIOWrapper(bz2.open(path, 'w'), encoding=encoding) as fout:
fout.write('Ciao')

with bz2.open(path, 'rb') as fin:
print("%5s" % io_module.__name__, 'bytes:', fin.read())


test(io)
test(_pyio)

打印:

   io bytes: b'C\x00i\x00a\x00o\x00'
_pyio bytes: b'\xff\xfeC\x00i\x00a\x00o\x00'

关于Python:模式 'wt' 中的 bz2 和 lzma 不编写 BOM(而 gzip 编写)。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55171439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com