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对象,我在这里问.
你不能。读取文件与其编码无关;您需要提前知道编码才能正确解释您读入的字节。
例如,如果您知道文件是以 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 字符的文件名,这有点不幸。