许多文本编码都具有以下属性:您可以通过编码文本向后并仍然可以对其进行解码。 ASCII,UTF-8,UTF-16和UTF-32都具有此属性。这使您可以轻松地读取文件的最后一行,而无需读取前面的所有行,或者从文件的当前位置向后退几行。
不幸的是,Python似乎没有任何方法可以向后解码文件。您不能read
向后,或seek
按编码文件中的字符数量。 codecs
模块中的解码器支持增量解码转发,但不支持倒退。似乎没有任何“UTF-8-backwardwards”编解码器,我可以以相反的顺序提供UTF-8字节。
我本可以自己实现与编解码器相关的字符边界同步,向后读取二进制块,并从codecs
模块向适当的解码器提供正确对齐的块,但这听起来像是一种非-expert会遗漏一些微妙的细节而不会注意输出是错误的。
有没有简单的方法可以使用现有工具在Python中向后解码文本?
有些人似乎错过了读取整个文件来实现此目的的观点。虽然我在澄清一些事情,但我还是可以补充说,这也需要适用于可变长度编码。 必须支持UTF-8 。
答案 0 :(得分:5)
缺少通用解决方案,以下是utf-8特有的解决方案:
def rdecode(it):
buffer = []
for ch in it:
och = ord(ch)
if not (och & 0x80):
yield ch.decode('utf-8')
elif not (och & 0x40):
buffer.append(ch)
else:
buffer.append(ch)
yield ''.join(reversed(buffer)).decode('utf-8')
buffer = []
utf8 = 'ho math\xc4\x93t\xc4\x93s hon \xc4\x93gap\xc4\x81 ho I\xc4\x93sous'
print utf8.decode('utf8')
for i in rdecode(reversed(utf8)):
print i,
print ""
结果:
$ python x.py
ho mathētēs hon ēgapā ho Iēsous
s u o s ē I o h ā p a g ē n o h s ē t ē h t a m o h