【发布时间】:2016-05-11 12:06:08
【问题描述】:
我有一段代码:
with open('filename.txt','r') as textfile:
kwList = [x.strip('\n') for x in textfile.readlines()]
我得到一个:UnicodeDecodeError : 'ascii' codec can't decode byte 0xc4 in position 5595: ordinal not in range(128) on line 2
问题是根据 python 文档: https://docs.python.org/3/library/functions.html#open
Python3 使用locale.getpreferredencoding(False) 获取在open 方法中没有指定编码时使用的默认编码。
当我运行 locale.getpreferredencoding(False) 时,我得到 'UTF-8'。
当 Python 应该使用“utf-8”来执行此操作时,为什么在 UnicodeDecodeError 中出现“ascii”编解码器失败?
【问题讨论】:
-
区域设置取决于您运行脚本的上下文。在相同的上下文中运行
locale.getpreferredencoding(False)命令。 -
UTF-8 首选编码是否在相同代码的同一运行中给出(例如,您在
with open(...) as textfile正上方添加了print(locale.getpreferredencoding(False))或通过其他方式? -
为什么不简单地将
encoding参数设置为open()调用? -
@MartijnPieters,我可以将编码传递给 open() 调用,我有,这只是出于好奇。在生产服务器上我遇到了这个问题。
-
@ChintanShah:您的生产代码可能使用相同的用户,但这并不意味着该代码使用相同的语言环境。如果您在 POSIX 系统(Mac、Linux 等)上运行它,则编码取自
LC_CTYPE环境变量,如果未明确设置,则从LC_ALL或LANG派生。因此,如果您的生产代码使用LANG=C或LC_ALL=C运行,则使用使用ASCII 作为编码的默认C 语言环境。
标签: python python-3.x encoding utf-8 python-3.4