【问题标题】:Dealing with UTF-8 numbers in Python在 Python 中处理 UTF-8 数字
【发布时间】:2026-02-12 09:05:01
【问题描述】:

假设我正在读取一个包含 3 个逗号分隔数字的文件。该文件以未知编码保存,到目前为止我正在处理 ANSI 和 UTF-8。如果文件是 UTF-8 格式,并且有 1 行的值为 115,113,12,则:

with open(file) as f:
    a,b,c=map(int,f.readline().split(','))

会抛出这个:

invalid literal for int() with base 10: '\xef\xbb\xbf115'

第一个数字总是被这些 '\xef\xbb\xbf' 字符弄乱。对于其余 2 个数字,转换工作正常。如果我手动将 '\xef\xbb\xbf' 替换为 '' 然后进行 int 转换,它将起作用。

对于任何类型的编码文件有更好的方法吗?

【问题讨论】:

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


    【解决方案1】:

    您看到的是 UTF-8 编码的BOM,或“字节顺序标记”。 BOM 通常不用于 UTF-8 文件,因此处理它的最佳方法可能是使用 UTF-8 编解码器打开文件,并跳过 U+FEFF 字符(如果存在)。

    【讨论】:

      【解决方案2】:
      import codecs
      
      with codecs.open(file, "r", "utf-8-sig") as f:
          a, b, c= map(int, f.readline().split(","))
      

      这适用于 Python 2.6.4。 codecs.open 调用打开文件并以 unicode 格式返回数据,从 UTF-8 解码并忽略初始 BOM。

      【讨论】:

      • 谢谢。这适用于我的 UTF-8 文件,但在 Unicode 和 Unicode big endian 上失败。是否有一种万无一失的方法可以打开任何类型的编码文件并获取这些数字,或者我必须明确指定编码?
      • AFAIK 你必须指定编码。显然,您可以编写一个小函数来执行三个测试并返回一个适当解码的文件。
      • 太棒了。我发现 chardet 模块正是这样做的chardet.feedparser.org
      • 上面代码中的小错误:a, b, c= map(int,f.readline().split(","))