gpt4 book ai didi

附加到末尾时文件中间的python utf-8-sig BOM

转载 作者:太空狗 更新时间:2023-10-29 22:26:25 26 4
gpt4 key购买 nike

我最近注意到,当使用 utf-8-sig 编码附加到文件时,Python 的行为方式并不明显。见下文:

>>> import codecs, os
>>> os.path.isfile('123')
False
>>> codecs.open('123', 'a', encoding='utf-8-sig').write('123\n')
>>> codecs.open('123', 'a', encoding='utf-8-sig').write('123\n')

以下文本以文件结尾:

<BOM>123
<BOM>123

这不是一个错误吗?这太不合逻辑了。谁能向我解释为什么这样做?为什么他们不设法仅在文件不存在且需要创建时才添加 BOM?

最佳答案

不,这不是错误;这是完全正常的预期行为。编解码器无法检测到文件中已经写入了多少;例如,您可以使用它附加到预先创建但 的文件。该文件不会是新的,但也不包含 BOM。

还有其他用例,其中编解码器用于流或字节串(例如,不使用 codecs.open()),那里根本没有文件 进行测试,或者开发人员希望始终在输出开始时强制执行 BOM。

仅在 文件上使用utf-8-sig;编解码器将始终在您使用时写出 BOM。

如果您直接使用文件,您可以自己开始测试;使用 utf-8 并手动编写 BOM,这只是一个编码的 U+FEFF ZERO WIDTH NO-BREAK SPACE :

import io

with io.open(filename, 'a', encoding='utf8') as outfh:
if outfh.tell() == 0:
# start of file
outfh.write(u'\ufeff')

我使用了较新的 io.open()而不是 codecs.open()io 是为 Python 3 开发的新 I/O 框架,根据我的经验,在处理编码文件方面比 codecs 更健壮。

请注意,UTF-8 BOM 几乎毫无用处,真的。 UTF-8 没有可变字节顺序,所以只有一个字节顺序标记。另一方面,UTF-16 或 UTF-32 可以用两种不同的字节顺序之一编写,这就是需要 BOM 的原因。

Microsoft 产品主要使用 UTF-8 BOM 来自动检测文件的编码(例如,不是遗留代码页之一)。

关于附加到末尾时文件中间的python utf-8-sig BOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23154355/

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