如何在Python 2.7中一次解码一行unicode?

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字符 - 这个完整流的解码正是我试图避免的操作.

这不是一个不常见的要求.处理它的正确方法是什么?

Sim*_*lan 7

怎么样尝试像:

for line in codecs.open("filename", "rt", "utf32"):
    print line
Run Code Online (Sandbox Code Playgroud)

我认为这应该有效.

codecs模块应该为您进行翻译.