Python 3 unicode 到 utf-8 文件

Python 3 unicode to utf-8 on file

我正在尝试通过日志文件进行解析,但文件格式始终为 unicode。我想要自动化的常用流程:

  • I pull file up in notepad
  • Save as...
  • change encoding from unicode to UTF-8
  • Then run python program on it

所以这是我想在 Python 3.4 中自动化的过程。几乎只是将文件更改为 UTF-8 或类似 open(filename,'r',encoding='utf-8') 的内容,尽管当我尝试对其调用 read() 时,这一行向我抛出了这个错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

如果我可以转换整个文件(就像在我的第一个场景中那样)或者只是以 UTF-8 格式打开整个文件,那将是非常有帮助的,这样我就不必 str.encode(或其他东西)就像那样)每次我分析一个字符串。

有人经历过这个并且知道我应该使用哪种方法以及如何做?

编辑:

在 python3 的 repr 中,我做了

>>> f = open('file.txt','r')
>>> f
(_io.TextIOWrapper name='file.txt' mode='r' encoding='cp1252')

所以现在我的程序中的 python 代码用 open('file.txt','r',encoding='cp1252') 打开文件。虽然我 运行 很多正则表达式都在浏览这个文件,但它并没有把它捡起来(我想是因为它不是 utf-8)。所以我只需要弄清楚如何从 cp1252 切换到 UTF-8。谢谢@Mark Ransom

记事本认为Unicode的是utf16到Python。 Windows "Unicode" 文件以 FF FE 的字节顺序标记 (BOM) 开头,表示小端 UTF-16。这就是为什么在使用 utf8 解码文件时会得到以下结果:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

要转换为 UTF-8,您可以使用:

with open('log.txt',encoding='utf16') as f:
    data = f.read()
with open('utf8.txt','w',encoding='utf8') as f:
    f.write(data)

请注意,许多 Windows 编辑器喜欢文件开头的 UTF-8 签名,或者可能假设 ANSI 代替。 ANSI 确实是本地语言环境。在美国 Windows 上它是 cp1252,但它因其他本地化版本而异。如果打开utf8.txt还是乱码,写的时候用encoding='utf-8-sig'代替