Python open("x", "r") 函数,如何知道或控制文件的编码?

8 投票
1 回答
26555 浏览
提问于 2025-04-16 16:46

如果一个Python脚本使用open("filename", "r")这个函数来打开并读取一个文本文件的内容,我该怎么知道这个文件应该用什么编码呢?

需要注意的是,因为我是在自己的程序中执行这个脚本,所以如果有任何方法可以通过环境变量来控制这个编码,那对我来说就足够了。

顺便说一下,这里用的是Python 2.7。

这个代码来自Mercurial,它可以通过一个磁盘上的文件来获取文件列表,比如说添加到版本库,而不是通过命令行传递这些文件。

所以基本上,我可以这样做:

hg add A B C

我可以把A、B和C写到一个文件里,每个之间用换行符隔开,然后执行以下代码:

hg add listfile:input.txt

最后读取这个文件的代码是:

files = open(name, 'r').read().split(delimiter)

所以我才有这个问题。当我在IRC上问应该用什么编码时,得到的回答是:

这和你在命令行中传递文件参数时使用的编码是一样的。

我理解这意味着它和我执行Mercurial(hg)时使用的编码是一样的。因为我不知道那是什么编码,所以我把所有内容都交给了.NET的Process对象,所以我在这里询问。

1 个回答

6

你不能这样做。读取一个文件和它的编码是两回事;你需要提前知道文件的编码,才能正确理解你读取到的字节。

比如,如果你知道这个文件是用UTF-8编码的:

with open('filename', 'rb') as f:
    contents = f.read().decode('utf-8-sig')    # -sig deals with BOM, if present

或者如果你知道这个文件只有ASCII编码:

with open('filename', 'r') as f:
    contents = f.read()    # results in a str object

如果你真的不知道这个文件的编码,那就没办法保证你能正确读取它;不过,你可以使用一个工具,比如chardet,来猜测一下编码。

更新:

我现在明白你的问题了。我原以为你有一个文件需要写代码处理,但其实你是有代码需要写成文件;-)

这里提到的代码可能只适用于纯ASCII(也就是字符编码小于128的字符),虽然字符串可能在后面会被转换,但我觉得不太可能。所以你需要创建一个只包含ASCII字符的文本文件,并确保它是用ASCII编码保存的(也就是说,不要用UTF-16或其他编码)。这有点不方便,因为Mercurial处理的文件名可以包含Unicode字符。

撰写回答