0

When I use simple I/o calls to read a particular file on my system, such as:

f = open('file.ini')
for line in f.readlines():
    print line

I'm getting output such as this:

 H E L L O !  W H Y  A R E  T H E R E  S O  M A N Y  S P A C E S ?

I presume it's Unicode but I can't quite figure out how to read it as Unicode / convert it to ascii. Suggestions?

4

2 に答える 2

4

を使用してファイルを開いてみてくださいcodecs

例:

import codecs
f = codecs.open('file.ini', encoding='utf-16-le')  # You can experiment with different encodings
for line in f:  # note, the readlines is not really needed
    print line,  # the comma strips the trailing newline in case that's bothering you

PS: エンコーディングがわからない場合は、この質問を見ることをお勧めします: Python でテキストのエンコーディングを決定する

于 2012-10-09T23:34:00.550 に答える
1

非常に規則的なスペースは、通常、データが 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 データを見ていない可能性があり、調べているエンコーディングを把握するためにさらに調査を行う必要があります。

于 2012-10-09T23:40:54.820 に答える