2016-04-12 8 views
6

多くのテキストエンコードには、エンコードされたテキストを後ろ向きにしてにデコードできるというプロパティがあります。 ASCII、UTF-8、UTF-16、およびUTF-32はすべてこのプロパティを持ちます。これにより、ファイルの最後の行を読み込む前にすべての行を読むことなく、ファイル内の現在の位置から数行先に移動するような便利なことができます。ユニコードテキストを逆方向にデコードする

残念ながら、Pythonはファイルを逆方向​​にデコードすることはありません。 read後方には、またはseekは、エンコードされたファイル内の文字数で表示することはできません。 codecsモジュールのデコーダは、インクリメンタルデコーディングを転送するのに、をサポートしますが、後方はサポートしません。 UTF-8バイトを逆順に送ることができる「UTF-8-backwards」コーデックはないようです。

おそらくコーデックに依存する文字境界の同期を自分自身で実装し、バイナリチャンクを逆方向に読み込み、codecsモジュールの適切なデコーダに正しく整列されたチャンクを送ることができますが、それは非専門家が微妙なディテールを逃し、出力が間違っていることに気付かない。

Pythonで既存のツールを使ってテキストを逆方向に復号する方法はありますか?


何人かががこれを行うには、ファイル全体を読むことを目的を破ることにポイントを逃しているように見えます。私が物事を明確にしている間に、私はもこれが可変長エンコーディングのために働く必要があると付け加えるかもしれません。 UTF-8をサポートする必要がありますです。ここ

+0

可能性のある重複した[パイソンを使用して逆の順序でファイルを読む](HTTP ://stackoverflow.com/questions/2301789/read-a-file-in-reverse-order-using-python) – gravity

+0

@gravity:それはファイル全体を読み込みます。私は特にそれをしないようにしています。 – user2357112

+0

そこには特定のコミュニティWikiの回答があります。このダイレクトリンクでご覧ください:http://stackoverflow.com/questions/260273/most-efficient-way-to-search-the-last-x-lines-of-a-file-in-python/260433#260433 – gravity

答えて

4

不在汎用ソリューションは、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 
+0

実際のファイルを操作するために必要とするチャンクの最適化はありませんが、「自分で実装する」ケースのように思っていたようです。私が扱おうとは思わなかった作業の多くは、実際には複数のコーデックのサポートと、前方と後方と後方の 'read'をサポートする便利で効率的なファイルオブジェクトの作成でした。 UTF-8だけでは、デコード自体がそれほど悪くはありません。 – user2357112

関連する問題