【问题标题】:python utf-8-sig BOM in the middle of the file when appending to the endpython utf-8-sig BOM在文件中间追加时追加到末尾
【发布时间】:2014-06-02 23:26:58
【问题描述】:

我最近注意到,当使用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?

【问题讨论】:

  • 不,这不是错误;这是完全预期的行为。编解码器无法检测到文件已写入多少内容。

标签: python utf-8 byte-order-mark


【解决方案1】:

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

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

只在 new 文件上使用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 的原因。

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

【讨论】:

    猜你喜欢
    • 2013-10-26
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2011-08-19
    • 2019-05-30
    • 2018-03-15
    相关资源
    最近更新 更多