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

标签 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

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

filename = 'pi_million_digits.txt'

with open(filename) as file_object:
    lines = file_object.readlines()

pi_string = ''
for line in lines:
    pi_string += line.strip()

print(pi_string[:52] + "...")
print(len(pi_string))

但是除了前面有相同的奇怪符号:“3.141....”之外,生成的输出是正确的

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

最佳答案

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

如果以字节形式打开它并阅读第一行,您应该会看到如下内容:

>>> 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.

关于python - 为什么  出现在我的数据中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44053478/

相关文章:

python - 获取行 b_1 减去行 b_2 的差值最小的行 a

python - 在 Python 中定义强类型变量

获取我最新推文的 Python 脚本在我的服务器上停止工作

php - 如何让 MySQL 返回 UTF-8?

mysql - MySQL如何检测中文字符?

python - Pandas 数据帧 : merge files by common columns

python - 为什么 'is' 运算符说这些方法不一样?

python - 更改类的 __name__ 并从实例访问它时出错

python - 在 Python 3 中将二进制字符串转换为字节数组

mysql - 编码的字节序列无效 "UTF8": 0xed 0xa0 0xbd