Baz*_*man 4 python byte-order-mark utf-8 character-encoding python-3.x
我从这里下载文件“ 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))
Run Code Online (Sandbox Code Playgroud)
但是,产生的输出是正确的,除了它之前带有相同的奇怪符号:“3.141 ....”
是什么导致这些奇怪的符号?我正在剥线,所以我希望这些符号会被删除。
看来您正在使用ISO-8859-1编码打开带有UTF-8编码的字节顺序标记的文件(大概是因为这是操作系统上的默认编码)。
如果以字节为单位打开它并阅读第一行,则应该看到类似以下内容的内容:
>>> next(open('pi_million_digits.txt', 'rb'))
b'\xef\xbb\xbf3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679\n'
Run Code Online (Sandbox Code Playgroud)
… \xef\xbb\xbfBOM的UTF-8编码在哪里。以ISO-8859-1开头,看起来像您得到的是:
>>> next(open('pi_million_digits.txt', encoding='iso-8859-1'))
'3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679\n'
Run Code Online (Sandbox Code Playgroud)
…并将其打开为UTF-8会显示实际的BOM表字符U + FEFF:
>>> next(open('pi_million_digits.txt', encoding='utf-8'))
'\ufeff3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679\n'
Run Code Online (Sandbox Code Playgroud)
要删除标记,请使用特殊编码utf-8-sig:
>>> next(open('pi_million_digits.txt', encoding='utf-8-sig'))
'3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679\n'
Run Code Online (Sandbox Code Playgroud)
next()在以上示例中使用仅仅是出于演示目的。在您的代码中,您只需要将encoding参数添加到您的open()行中,例如
with open(filename, encoding='utf-8-sig') as file_object:
# ... etc.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2324 次 |
| 最近记录: |