Python open 函数应该使用哪种编码?
Which encoding should Python open function use?
我在读取包含右双引号 Unicode 符号的文件时遇到异常。它以 UTF-8 (0xE2 0x80 0x9D) 编码。最小示例:
import sys
print(sys.getdefaultencoding())
f = open("input.txt", "r")
r.readline()
即使正确的引号不在第一行,此脚本也无法读取第一行。异常看起来像这样:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Program Files\Python36\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 102: char
acter maps to <undefined>
输入文件是utf-8编码,有无BOM我都试过了。 sys.getdefaultencoding()
返回的默认编码是utf-8。
此脚本在 Python 3.6.5 的机器上失败,但在另一台 Python 3.6.0 的机器上运行良好。两台机器都是Windows.
我的问题主要是理论性的,因为这个异常是从我无法更改的外部软件中抛出的,并且它读取了我不想更改的文件。除了 Python 补丁版本外,这些机器应该有什么区别?如果系统默认是 utf-8,为什么 vanilla open
使用 cp1252?
正如 Python 的 open 文档中明确指出的那样:
In text mode, if encoding is not specified the encoding used is platform dependent: locale.getpreferredencoding(False)
is called to get the current locale encoding.
Windows 默认为本地化编码(美国和西欧版本为 cp1252
)。 Linux 通常默认为 utf-8
.
因为它依赖于平台,所以使用encoding参数并明确指定文件的编码。
我在读取包含右双引号 Unicode 符号的文件时遇到异常。它以 UTF-8 (0xE2 0x80 0x9D) 编码。最小示例:
import sys
print(sys.getdefaultencoding())
f = open("input.txt", "r")
r.readline()
即使正确的引号不在第一行,此脚本也无法读取第一行。异常看起来像这样:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Program Files\Python36\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 102: char
acter maps to <undefined>
输入文件是utf-8编码,有无BOM我都试过了。 sys.getdefaultencoding()
返回的默认编码是utf-8。
此脚本在 Python 3.6.5 的机器上失败,但在另一台 Python 3.6.0 的机器上运行良好。两台机器都是Windows.
我的问题主要是理论性的,因为这个异常是从我无法更改的外部软件中抛出的,并且它读取了我不想更改的文件。除了 Python 补丁版本外,这些机器应该有什么区别?如果系统默认是 utf-8,为什么 vanilla open
使用 cp1252?
正如 Python 的 open 文档中明确指出的那样:
In text mode, if encoding is not specified the encoding used is platform dependent:
locale.getpreferredencoding(False)
is called to get the current locale encoding.
Windows 默认为本地化编码(美国和西欧版本为 cp1252
)。 Linux 通常默认为 utf-8
.
因为它依赖于平台,所以使用encoding参数并明确指定文件的编码。