非常に規則的なスペースは、通常、データが UTF16 でエンコードされていることを示しています。通常、2 バイトごとに 0 バイトが表示されます。これは、読み取っている実際のバイナリ データを出力することで確認できます。
f = open('file.ini')
line in f.readline():
print map(ord, line)
次のような出力が表示された場合:
[..., 68, 0, 65, 0, 76, 0, 76, 0, 79, ...]
それならほぼ間違いない。
トリックは、それが 0 である偶数バイトか奇数バイトかを把握することです。UTF-16 エンコーディングには、ビッグ エンディアンとリトル エンディアンの 2 つがあり、最初に来るバイトの意味にちなんで名付けられました。関連付けられている文字の前に0 がある場合、ファイルはビッグエンディアンであり、次のように開くことができます (Python 3.x):
f = open('file.ini', encoding='utf16be')
Python 2.x では、codecs
モジュールをインポートしてこれを行います。
import codecs
f = codecs.open('file.ini', encoding='utf16be')
0 が後に来る場合は、substitude 'utf16le' です。
(ファイルを読み込んでいるときにファイルをデコードするか、デコードする前にコンテンツ全体をメモリに読み込む必要があります。デコードする前に行を分割したくないことは間違いありません)
運が良ければ、ファイルは先頭にバイト オーダー マークを付けて書き込まれました。この文字は U+FEFF です。最初の 2 バイトが[254, 255]
の場合、エンコーディングはビッグエンディアンであり、 の場合[255, 254]
、リトル-エンディアン。
これらのいずれにも当てはまらない場合は、UTF-16 データを見ていない可能性があり、調べているエンコーディングを把握するためにさらに調査を行う必要があります。