为什么出现在我的数据中?

时间:2017-05-18 16:39:28

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

我从这里下载了'pi_million_digits.txt'文件:

https://github.com/ehmatthes/pcc/blob/master/chapter_10/pi_million_digits.txt

然后我使用此代码打开并阅读它:

dicts

然而产生的输出是正确的,除了它之前有相同的奇怪符号:“3.141 ....”

是什么导致这些奇怪的符号?我正在剥线,所以我希望删除这些符号。

1 个答案:

答案 0 :(得分:5)

您似乎正在使用ISO-8859-1编码使用UTF-8编码Byte Order Mark打开文件(可能是因为这是您操作系统上的默认编码)。

如果你打开它作为字节并读取第一行,你应该看到这样的东西:

>>> next(open('pi_million_digits.txt', 'rb'))
b'\xef\xbb\xbf3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679\n'

...其中\xef\xbb\xbf是BOM的UTF-8编码。作为ISO-8859-1打开,它看起来像你得到的:

>>> next(open('pi_million_digits.txt', encoding='iso-8859-1'))
'3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679\n'

...并以UTF-8打开它显示实际的BOM字符U + FEFF:

>>> next(open('pi_million_digits.txt', encoding='utf-8'))
'\ufeff3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679\n'

要删除标记,请使用特殊编码utf-8-sig

>>> next(open('pi_million_digits.txt', encoding='utf-8-sig'))
'3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679\n'

在上面的示例中使用next()仅用于演示目的。在您的代码中,您只需要将encoding参数添加到open()行,例如

with open(filename, encoding='utf-8-sig') as file_object:
    # ... etc.