Python 3:读取包含德语umlaut的UTF-8文件

7
我搜索了许多类似的问题和文章,但没有一个可以解决这个问题。
我使用的是Windows 10上的Python 3.5.0 (v3.5.0:374f501f4567,Sep 13 2015,02:27:37) [MSC v.1900 64 bit (AMD64)]。
我有一个简单的文本文件,它以UTF-8编码为Windows格式,如下所示:enter image description here 我想做的只是将该文件的内容读取到Python字符串中,并在标准控制台中正确显示。
以下是第一次尝试,失败得惨痛:
    file_name=r'c:\temp\encoding_test.txt'
    fh=open(file_name,'r')
    f_str=fh.read()
    fh.close()
    print(f_str)

打印语句引发了一个异常:
'charmap'编解码器无法在位置100处编码字符'\u201e':字符映射到未定义
使用调试器,f_str包含以下内容:
'I would like the following characters to display correctly after reading this file into Python:\n\nÄÖÜäöüß\n'
这已经让我非常困惑了。Python 3不是在所有地方都使用UTF-8作为默认值吗?还有哪些编码可以工作?我尝试了Notepad++支持的所有编码,但都不起作用。
好的,再深入一点,我尝试了:
    import codecs
    file_name=r'c:\temp\encoding_test.txt'
    my_encoding='utf-8'
    fh=codecs.open(file_name,'r',encoding=my_encoding)
    f_str=fh.read().encode(my_encoding)
    fh.close()
    print(f_str)

这不会引发异常,至少如此,但会产生以下结果:

“我希望在将文件读入Python后,能正确显示以下字符:\r\n\r\n\xc3\x84\xc3\x96\xc3\x9c\xc3\xa4\xc3\xb6\xc3\xbc\xc3\x9f\r\n”

对我来说,这完全是一团糟。请问有谁能帮我梳理一下?


我真的很喜欢你对“失败惨重”的描述!我可以想象脚本是悲惨和悲伤的 :) - Scinana
2个回答

18

被接受的答案过于复杂。你只需要为open指定编码即可:

fh = open(file_name, encoding='utf8')

一切都没有问题。

对于你的另一个问题的答案:

Python 3 默认使用 UTF-8 吗?

“不是当与外部世界(在这种情况下为文件系统)通信时,因为这将与您的操作系统不一致。”规范说明用户首选编码取决于所在区域。

>>> import locale
>>> locale.getpreferredencoding()

如果你想查看系统中的编码方式,最可能的是在Windows上使用"cp something"命令,具体取决于默认代码页的设置。但是你可以始终使用显式encoding参数来覆盖它。

希望这能带给你新的知识。 :-)


1
更好的解决方案! - RightmireM

3

在使用codecs.open后,您要将其编码为字节码,只需打印数据即可得到您想要的结果,当我们解码回来时可以看到:

In [31]: s = b'I would like the following characters to display correctly after reading this file into Python:\r\n\r\n\xc3\x84\xc3\x96\xc3\x9c\xc3\xa4\xc3\xb6\xc3\xbc\xc3\x9f\r\n'

In [32]: print(s)
b'I would like the following characters to display correctly after reading this file into Python:\r\n\r\n\xc3\x84\xc3\x96\xc3\x9c\xc3\xa4\xc3\xb6\xc3\xbc\xc3\x9f\r\n'

In [33]: print(s.decode("utf-8"))
I would like the following characters to display correctly after reading this file into Python:

ÄÖÜäöüß

如果您没有看到正确的输出,那么问题可能出在您的 shell 编码上。Windows 控制台编码不是 utf-8,因此您运行代码的位置和 shell 编码都很重要。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接