2011-07-21 2 views
16

何らかの理由で私はutf16ファイルを探すことができません。 'UnicodeException:UTF-16ストリームがBOMで始まらない'を生成します。私のコード:utf-16 pythonでシークするファイル。どうやって?

f = codecs.open(ai_file, 'r', 'utf-16') 
seek = self.ai_map[self._cbClass.Text] #seek is valid int 
f.seek(seek) 
while True: 
    ln = f.readline().strip() 

私はストリームから何かを最初に読んだようなものを試してみました。私は16進エディタを使用することを求められてオフセットをチェックしました - 文字列で始まる文字列、ヌルバイトではありません(私はその良い印象でしょうか?) どのようにして、utf-16をpythonで探しますか?

答えて

23

エラーメッセージは、理由を示しています。バイトオーダーマークを読み取っていません。バイトオーダーマークは、ファイルの先頭にあります。バイトオーダーマークを読み取ることなく、UTF-16デコーダーはバイトがどのような順序であるかを知ることができません。ファイルを開いたときではなく、最初に読んだときに遅延が発生します。そうでない場合は、 seek()が新しいUTF-16ストリームを開始していることを示します。

ファイルにBOMがない場合は、間違いなく問題あり、ファイルを開くときにバイトオーダーを指定する必要があります(下記#2を参照)。それ以外の場合は、2つの潜在的な解決策があります。

  1. ファイルの最初の2バイトを読み取ってシーク前に取得します。あなたはそう、おそらくそれは追求した後、新鮮なUTF-16ストリームを期待していたことを示す、これは動作しませんでしたと言っているように見える:

  2. は、ファイルを開いたときのエンコーディングとしてutf-16-leまたはutf-16-beを使用して明示的にバイト順序を指定します。

+0

本当にありがとうございます! – marrat

+1

thx utf-16-le/beの束。初めて仕事をした – javadba

関連する問題