如何在 Windows 上以正确的编码打开 python 中的文本文件?

How to open a textfile in python on windows with the correct encoding?

提问人:julaine 提问时间:9/14/2023 更新时间:9/14/2023 访问量:59

问:

我知道正确确定文本的编码是不可能的。 但是,我注意到记事本等程序可以正确读取以 utf-8 编码的文件,我想在 python 中做同样的事情。

open不能这样做,python3.11 中记录了使用系统本地编码作为默认值,在我的机器上是“cp1252”,因此行为不依赖于文件或其元数据中可能存在的任何 BOM 或其他魔术。

以下代码在 python 版本 3.7、3.10 和 3.11 上的作用相同(这是我尝试过的所有内容):


fname = "tmpWindowsOut.txt"
with open(fname, "w", encoding="utf-8") as f:
    # if encoding wasn't specified in `open` this fails with the infamous 
    # UnicodeEncodeError: 'charmap' codec can't encode character '\u03b2' in position 1: character maps to <undefined>
    f.write("βKHα") 

with open(fname, "r") as f:
    print(f.read()) # prints βKHα

# opening the file with notepad shows the correct output

我知道我可以通过将 encoding-parameter 传递给另一个 -call 来正确读取文件,问题不在于如何读取已知编码的文件。问题是如何:openutf-8

  1. 在不指定编码的情况下正确执行 -partread
  2. 以一种使 No.1 更容易(甚至可能)的方式执行 -partwrite
python windows unicode utf-8 字符编码

评论

0赞 Giacomo Catenazzi 9/14/2023
使用 HTML 使用的技巧:open is as 'utf-8'(显式),如果失败,则使用默认的系统编码,否则使用 cp437 打开(或系统 + 转义错误)。所有文本都转换为 UTF-8,因此这是一个漂亮且简单的默认值。如果您想要更多信息,请查看 UTF-16 和 UTF-32(预计开始时会有 BOM)。
0赞 julaine 9/15/2023
@GiacomoCatenazzi,总的来说,这似乎是一种好方法,但在几行中实现太难了,因为检查异常是不够的 - 在上面的示例中,读取不会失败,但会产生废话。所以你需要检测废话。我会找一个图书馆,我希望避免这种情况。
0赞 Giacomo Catenazzi 9/15/2023
def my_open(...): try ret=open(, encoding='utf-8'): except UnicodeError: ret = open() return ret;
0赞 julaine 9/15/2023
@GiacomoCatenazzi不,那行不通。读取编码错误的文件并不能可靠地产生异常 - 它通常会导致数据错误。就像我问题中的例子一样:以错误的方式阅读“βKHα”会产生“βKHα”
0赞 julaine 9/15/2023
图书馆需要检测“βKHα”不太可能具有真正的含义。这对于普通的人类语言来说已经足够困难了,但在这里却格外困难,因为你也不会在字典中找到真正的文本“βKHα”,它在一个非常特殊的工程环境中具有意义。

答: 暂无答案