在Python中处理UTF-8编码的数字

11

假设我正在读取一个包含3个逗号分隔的数字的文件,该文件保存在未知编码方式下,目前我正在处理ANSI和UTF-8。如果文件采用UTF-8格式,并且其中有一行数值为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'字符搅在一起。对于其余的两个数字,转换工作正常。如果我手动用''替换'\xef\xbb\xbf',然后进行int类型转换,它会起作用。

是否有更好的方法适用于任何类型的编码文件?

2个回答

17
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上失败了。有没有一种绝对可靠的方法来打开任何类型的编码文件并获取这些数字,或者我必须明确指定编码方式? - Ηλίας
据我所知,您必须指定编码方式。显然,您可以编写一个小函数来执行三个测试并返回适当解码的文件。 - tzot
太好了。我找到了一个名为chardet的模块,它可以完美地实现这个功能。http://chardet.feedparser.org/ - Ηλίας
1
你的代码有一个小错误:a,b,c = map(int,f.readline().split(",")) - Ηλίας

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接