从Python 2.7版加载Unicode文本正确的方法是这样的:如何在Python 2.7中一次解码unicode一行?
content = open('filename').read().decode('encoding'):
for line in content.splitlines():
process(line)
(更新:不,它是看不到答案。)
但是,如果该文件是非常大的时候,我可能需要一次读取,解码和处理它,这样整个文件就不会一次加载到内存中。喜欢的东西:
for line in open('filename'):
process(line.decode('encoding'))
的for
循环的在开放的文件句柄迭代是一个生成器,一次读取一行。
这不工作,虽然,因为如果该文件是UTF32编码,例如,然后将文件中的字节(十六进制)看起来像:
hello\n = 68000000(h) 65000000(e) 6c000000(l) 6c000000(l) 6f000000(o) 0a000000(\n)
而且分成所做线所述for
环分割的\n
字符的0a
字节,从而导致(在十六进制):
lines[0] = 0x 68000000 65000000 6c000000 6c000000 6f000000 0a
lines[1] = 0x 000000
所以\n
字符的一部分则留在第1行的端部,并且剩余的三个字节中终止第2行(接着是实际上在第2行中的任何文本。)在这些行中的任一行上调用decode
可以理解为导致UnicodeDecodeError
。
UnicodeDecodeError: 'utf32' codec can't decode byte 0x0a in position 24: truncated data
所以,很明显的是,在0a
字节分裂Unicode字节流不是将其分割成线的正确方法。相反,我应该分裂出现的全四字节换行符(0x0a000000)。不过,我认为检测这些字符的正确方法是将字节流解码为一个Unicode字符串并查找\n
个字符 - 而完整流的解码正是我试图避免的操作。
这不是一个不常见的要求。处理它的正确方法是什么?使用的编解码器模块
您是否尝试使用codecs.open()方法读取文件? – 2012-08-08 14:25:28
@Maulwurfn,我不知道它存在!但我现在做。谢谢。 – 2012-08-08 15:43:27