从python 2.7.x到3.5.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() 然后: 最后,如果行不是注释或另一个配置文件的

我目前正在将一些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()
然后:

最后,如果行不是注释或另一个配置文件的包含,那么它最终会执行
打印(行)
。该脚本由C语言中的程序调用,然后该程序捕获python
print
的输出并解释其内容。在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'
    开头,以
    \n'
    结尾的行,这是C程序无法理解的
  • 使用
    encoding=“latin_1”
    运行
    open
    。文件被读取,但打印再次失败。为了运行打印,我使用
    sys.stdout=codecs.getwriter(“latin_1”)(sys.stdout.detach())
    将标准输出的编码(设置为ANSI_X3.4-1968)重写为utf-8。这感觉很“脏”,所以最后我导出了
    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)