这不是具体而是一般性问题:Python在不同平台上处理Unicode的方式有何不同?
我使用Python 3来读取文本文件。以下代码打开文件并跳过第一行:
fin = open(filename, 'rt')
next(fin)
我在Linux计算机和Mac上运行相同的代码。我使用使用相同environment.yml
文件创建的conda环境。我还验证了我在两台计算机上使用相同的Python版本(Python 3.6.3 :: Anaconda,Inc。)。数据文件是从同一个Git存储库中获取的。出于某种原因,Linux版本引发了一个例外:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 139: ordinal not in range(128)
答案 0 :(得分:2)
来自the python3 docs for the open() builtin:
...在文本模式下...文件的内容返回为
str
,首先使用平台相关编码或使用指定的编码对字节进行解码如果给定...默认编码取决于平台(无论locale.getpreferredencoding()返回什么)......
您确定locale lib报告的首选编码在两个平台上都相同吗?您可以强制执行编码以读取文本文件,如下所示:
fin = open(filename, 'r', encoding='utf-8')
next(fin)
请注意,您不需要文件模式rt
,因为假定基本文件读取模式为t
;事实上,您也不需要r
,因为它是默认模式。所以你可以这样做,如果你愿意:
fin = open(filename, encoding='utf-8')
答案 1 :(得分:-1)
编码并不依赖于python,而是取决于你的LOCALE变量。
您可能没有使用UTF-8语言环境。您可以使用
检查哪个语言环境python正在使用import locale
print(locale.getpreferredencoding(False))'
在你的Mac上应该返回UTF-8
,而在你的linux系统上应该是US-ASCII
如何解决?
在大多数系统上,语言环境取自环境变量(参见the POSIX locale documentation
将LC_ALL=en.UTF-8
添加到.bash_profile
或同等内容可以解决问题。