Python在不同平台上处理Unicode的方式有什么不同吗?

Python在不同平台上处理Unicode的方式有什么不同吗?,python,unicode,Python,Unicode,这不是一个具体的问题,而是一个一般性的问题:Python在不同平台上处理Unicode的方式有什么不同吗 我使用Python3读取文本文件。以下代码打开文件并跳过第一行: fin = open(filename, 'rt') next(fin) 我在Linux计算机和Mac上运行相同的代码。我使用的conda环境是使用相同的environment.yml文件创建的。我还验证了我在两台计算机上使用了相同的Python版本(Python 3.6.3::Anaconda,Inc.)。数据文件从同一G

这不是一个具体的问题,而是一个一般性的问题:Python在不同平台上处理Unicode的方式有什么不同吗

我使用Python3读取文本文件。以下代码打开文件并跳过第一行:

fin = open(filename, 'rt')
next(fin)
我在Linux计算机和Mac上运行相同的代码。我使用的conda环境是使用相同的
environment.yml
文件创建的。我还验证了我在两台计算机上使用了相同的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)

编码不依赖于python,而是依赖于您的语言环境变量

很可能您没有使用UTF-8语言环境。您可以检查python使用的语言环境

import locale
print(locale.getpreferredencoding(False))'
在你的Mac上哪个应该返回
UTF-8
,而在你的linux系统上类似于
US-ASCII

如何修复它?

在大多数系统上,区域设置取自环境变量(请参阅

LC\u ALL=en.UTF-8
添加到您的
.bash\u配置文件
或等效文件将解决此问题。

来自:

…在文本模式下…文件的内容返回为
str
,首先使用平台相关编码或使用指定编码(如果给定)解码的字节…默认编码是平台相关的(无论返回什么)

您确定区域设置库报告的首选编码在两种平台上都是相同的吗?您可以强制执行编码以读取文本文件,如下所示:

fin = open(filename, 'r', encoding='utf-8')
next(fin)
请注意,您不需要文件模式
rt
,因为基本文件读取模式假定为
t
;事实上,您也不需要
r
,因为这是默认模式。因此,如果您愿意,您可以这样做:

fin = open(filename, encoding='utf-8')

检查事项:您是否真的在使用Python 3,以及它在失败的平台上提供了什么。“在文本模式下,如果未指定编码,则使用的编码取决于平台:
locale。调用getpreferredencoding(False)
,以获取当前的语言环境编码。”由于您似乎可以控制数据文件,因此选择要使用的编码,并在打开数据文件时将其显式传递给
open()
显式优于隐式
。在处理文本文件时,一个好的BKM是始终在
open
中指定编码
'r'
是默认值,也不需要:^)回答得好!