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

Python open(";x";,";r";)函数,我如何知道或控制文件应该使用哪种编码?,python,encoding,text-files,Python,Encoding,Text Files,如果python脚本使用open(“filename”,“r”)函数打开并随后读取文本文件的内容,我如何知道该文件应该使用哪种编码 请注意,由于我是从自己的程序执行此脚本,如果有任何方法可以通过环境变量来控制此脚本,那么这对我来说已经足够好了 顺便说一下,这是Python2.7 所讨论的代码来自Mercurial,可以通过磁盘上的文件为其提供一个文件列表,例如,添加到存储库中,而不是在命令行上传递这些文件 因此,基本上,与此相反: hg add A B C 我可以将A、B和C写入一个文件,每个

如果python脚本使用
open(“filename”,“r”)
函数打开并随后读取文本文件的内容,我如何知道该文件应该使用哪种编码

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

顺便说一下,这是Python2.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进程对象,我在这里问。

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

例如,如果您知道该文件以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
如果您真的不知道文件的编码,那么显然无法保证您能够正确读取它;但是,您可以使用类似的工具猜测编码

更新

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


所讨论的代码可能只正确处理普通ASCII(字符串可能稍后转换,但我认为不太可能)。因此,您需要创建一个只包含ASCII(代码点<128)字符的文本文件,并确保它以ASCII编码保存(即,不是UTF-16或类似的格式)。考虑到Mercurial处理的文件名可能包含Unicode字符,这有点令人遗憾。

所以基本上编码是ASCII,这就是您要说的吗?所讨论的代码如下所示:
files=open(name,'r').read().split(delimiter)
@Lasse:不完全正确。我的意思是,只有当您知道编码是ASCII时,才应该这样做(否则您的字符串中会有一系列字节,而不是字符)。看一看更多的信息我不是100%肯定我理解你的评论。我不能更改有问题的代码。换句话说,无论是好是坏,我都必须遵守代码所期望的任何编码(或缺少编码)。从您的答案来看,编码只是ASCII码。如果是这样,那么就是这样了。@Lasse:这与你眼前的问题有些无关,但值得一读。你以前的评论没有多大意义。事实证明,Mercurial似乎根本无法处理文件名中的unicode字符。即使我要求Mercurial自己发现一个具有合法字符的文件,而这些字符通常不会出现在源代码文件名中,当它找不到该文件时,它也会崩溃。显然,它将字符解释为其他内容,然后无法定位文件。