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'
代替
我正在尝试通过日志文件进行解析,但文件格式始终为 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
的是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'
代替