我正在尝试解析日志文件,但文件格式始终为 unicode。我想自动化的常用流程:
- I pull file up in notepad
- Save as...
- change encoding from
unicode
toUTF-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
是 Python 的 utf16
。 Windows“Unicode”文件以 FF FE
的字节顺序标记 (BOM) 开头,表示 little-endian 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'
。
关于Python 3 unicode 到 utf-8 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28463053/