Jon*_*ley 5 python unicode file-io generator python-2.7
从Python 2.7加载unicode文本的正确方法如下:
content = open('filename').read().decode('encoding'):
for line in content.splitlines():
process(line)
Run Code Online (Sandbox Code Playgroud)
(更新:不,不是.请参阅答案.)
但是,如果文件非常大,我可能希望一次读取,解码和处理一行,这样整个文件永远不会一次加载到内存中.就像是:
for line in open('filename'):
process(line.decode('encoding'))
Run Code Online (Sandbox Code Playgroud)
该for循环的在开放的文件句柄迭代是一个生成器,一次读取一行.
但这不起作用,因为如果文件是utf32编码的,那么文件中的字节(十六进制)看起来像:
hello\n = 68000000(h) 65000000(e) 6c000000(l) 6c000000(l) 6f000000(o) 0a000000(\n)
Run Code Online (Sandbox Code Playgroud)
并且由for循环完成的行分割在字符的0a字节上\n,导致(以十六进制):
lines[0] = 0x 68000000 65000000 6c000000 6c000000 6f000000 0a
lines[1] = 0x 000000
Run Code Online (Sandbox Code Playgroud)
因此,\n字符的一部分留在第1行的末尾,其余三个字节在第2行结束(后面是第2行中的任何文本.)decode可以理解地调用这些行中的任何一行都会导致a UnicodeDecodeError.
UnicodeDecodeError: 'utf32' codec can't decode byte 0x0a in position 24: truncated data
Run Code Online (Sandbox Code Playgroud)
因此,显然,在字节上拆分unicode字节流0a并不是将其拆分为行的正确方法.相反,我应该分裂出现完整的四字节换行符(0x0a000000).但是,我认为检测这些字符的正确方法是将字节流解码为unicode字符串并查找\n字符 - 这个完整流的解码正是我试图避免的操作.
这不是一个不常见的要求.处理它的正确方法是什么?
怎么样尝试像:
for line in codecs.open("filename", "rt", "utf32"):
print line
Run Code Online (Sandbox Code Playgroud)
我认为这应该有效.
该codecs模块应该为您进行翻译.