Python open("x","r")函数,我如何知道或控制文件应该具有哪种编码?

ang*_*son 6 python encoding text-files

如果python脚本使用该open("filename", "r")函数打开并随后读取文本文件的内容,我该如何判断该文件应该具有哪种编码?

请注意,因为我正在从我自己的程序执行此脚本,如果有任何方法可以通过环境变量来控制它,那么这对我来说已经足够了.

顺便说一下,这是Python 2.7.

有问题的代码来自Mercurial,它可以通过磁盘上的文件给出一个文件列表,比如添加到存储库,而不是在命令行上传递它们.

所以基本上,而不是这个:

hg add A B C
Run Code Online (Sandbox Code Playgroud)

我可以将A,B和C写入文件,每个文件之间有换行符,然后执行以下命令:

hg add listfile:input.txt
Run Code Online (Sandbox Code Playgroud)

最终读取此文件的代码是:

files = open(name, 'r').read().split(delimiter)
Run Code Online (Sandbox Code Playgroud)

因此我的问题.当我询问我应该使用哪种编码时,我在IRC上给出的答案是:

它与传递文件参数时在命令行上使用的编码相同

我认为这意味着当我执行Mercurial(hg)时它与我"使用"的编码相同.由于我不知道是哪种编码,我只是将所有内容都提供给.NET Process对象,我在这里问.

Cam*_*ron 5

你不能。读取文件与其编码无关;您需要提前知道编码才能正确解释您读入的字节。

例如,如果您知道文件是以 UTF-8 编码的:

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

或者,如果您知道该文件仅为 ASCII:

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

如果您真的不知道文件的编码,那么显然不能保证您可以正确读取它;但是,您可以使用类似chardet.

更新

我想我现在明白你的问题了。我以为您有一个需要为其编写代码的文件,但似乎您有需要为其编写文件的代码;-)

有问题的代码可能只能正确处理纯 ASCII(字符串可能会在以后转换,但我认为不太可能)。因此,您需要制作一个仅包含 ASCII(代码点 < 128)字符的文本文件,并确保以 ASCII 编码(即不是 UTF-16 或类似格式)保存它。考虑到 Mercurial 处理可以包含 Unicode 字符的文件名,这有点不幸。