从python 2.7.x到3.5.x的编码问题
我目前正在将一些python 2.7.x代码移植到python 3.5.x 我使用2to3移植的一个脚本失败。这是一个读取主brewd配置文件的简单脚本。问题是,这些文件包含法语注释,带有重音,因此它们用拉丁字母1(iso-8859-1)编码。在之前的Python 2.7.x中,脚本执行了如下操作:从python 2.7.x到3.5.x的编码问题,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,我目前正在将一些python 2.7.x代码移植到python 3.5.x 我使用2to3移植的一个脚本失败。这是一个读取主brewd配置文件的简单脚本。问题是,这些文件包含法语注释,带有重音,因此它们用拉丁字母1(iso-8859-1)编码。在之前的Python 2.7.x中,脚本执行了如下操作: with open(path_to_file, 'r') as myfile: out_lines = myfile.readlines() 然后: 最后,如果行不是注释或另一个配置文件的
with open(path_to_file, 'r') as myfile:
out_lines = myfile.readlines()
然后:
最后,如果行不是注释或另一个配置文件的包含,那么它最终会执行打印(行)
。该脚本由C语言中的程序调用,然后该程序捕获pythonprint
的输出并解释其内容。在Python2.7.x中,它不指定编码是什么
现在在python 3.5.x中,调用
open
失败,出现以下异常:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 370: ordinal not in range(128)
我尝试了几件事:
- 使用
运行'rb'
,读取字节而不解释它们。但是,open
会返回以print
开头,以b'
结尾的行,这是C程序无法理解的\n'
- 使用
运行encoding=“latin_1”
。文件被读取,但打印再次失败。为了运行打印,我使用open
将标准输出的编码(设置为ANSI_X3.4-1968)重写为utf-8。这感觉很“脏”,所以最后我导出了sys.stdout=codecs.getwriter(“latin_1”)(sys.stdout.detach())
,它成功了pythonionecoding=“utf-8”
我的问题是:为什么它在Python2.7.x中工作?为什么使用ascii输入/输出,包含重音和特殊字符的行可以被读取然后打印?这可能与Python3中的字符串是unicode有关,但我在这里不知所措。另外,如果您认为我的“修复”不正确,请在注释/答案中提供一些建议。Python 3将字符串处理更改为更合理的方法。事实上,我们在Python2中所做的确实是一些黑客行为。因此,导致“转发不兼容”的问题是您有单独的问题。打开文件时不应依赖默认编码(请在打开文件时使用带有合适编解码器的
encoding='…'
),并且存在打印问题ANSI_X3.4-1968
是ASCII编解码器,这意味着您的标准输出语言环境设置为C
。Python 2忽略了文本中的编码。您基本上传递了二进制数据,并加入了一点行尾转换。
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 370: ordinal not in range(128)