我有一段代码:
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'编解码器失败?
1 回答
语言环境取自上下文;在POSIX系统上,这意味着环境变量,请参阅POSIX locale documentation . 如果要测试Python将决定哪种编码(例如,复制 生产环境 环境使用的环境变量),则需要重现 生产环境 环境的确切上下文 .
您可能正在将程序作为仅设置(或继承)有效用户的子进程运行,但不会为该用户复制环境 . 父进程已设置显式语言环境,或者如果未设置,则使用默认C语言环境 . 该语言环境的默认编码是ASCII;有些系统会通过名称ANSI_X3.4-1968报告:
例如,如果您的 生产环境 代码是从cron运行的,则在设置特定用户时不会设置环境变量 . 在crontab的顶部显式设置
LC_ALL
环境变量:如果您的cron实现支持以这种方式设置变量,或者在您要运行的命令行上设置它:
见Where can I set environment variables that crontab will use?