1

私はPythonを使用して、以下のセグメントのテキストファイルを読み取っています

(私は初心者なのでスクリーンショットを投稿できません)しかし、これはnotepad++でのように見えます:

NULSOHSOHNULNULNULSUBMesssage-ID:

エラー:

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    print(f.readline())
  File "C:\Python32\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 7673: character maps to <undefined>

ファイルをバイナリとして開く:

f = open('file.txt','rb')
f.readline()

テキストをバイナリとして表示します

b'\ x00 \ x01 \ x01 \ x00 \ x00 \ x00 \ x1a \ xb7Message-ID:

しかし、テキストをASCIIとして取得するにはどうすればよいですか?そして、これを処理する最も簡単な/pythonicな方法は何ですか?

4

3 に答える 3

2

テキストモードでファイルを開く場合、使用するエンコーディングを具体的に指定できます。

f = open('file.txt','r',encoding='ascii')

\xb7ただし、実際の問題は異なります。バイトがASCII範囲(0〜127)の外にあるため、引用したバイナリ部分をASCIIとして読み取ることができません。例外トレースバックは、Pythonがデフォルトでcp1252コーデックを使用していることを示しています。これはファイルもデコードできません。

ファイルがどのエンコーディングを使用しているかを把握するか、常にバイナリとして処理する必要があります。

于 2012-05-16T15:12:31.803 に答える
2

問題は、「位置1のバイト0x00」ではなく、「位置7673のバイト0x8f」にあります。つまり、NULは問題ではありません。ウィキペディアのcp-1252コードページを見ると、0x8fに対応する文字がないことがわかります。

より大きな問題は、ファイルが単一のエンコーディングではないことです。テキストセグメントのバイナリフレーミングが混在しているように見えます。あなたが本当にする必要があるのは、このファイルのフォーマットを理解し、それをバイナリピース(またはタプル、リスト、dict、オブジェクトなどのより豊富なデータ構造)に解析してから、テキストピースをユニコードにデコードすることですさらに処理する必要があります。

于 2012-05-16T15:14:04.490 に答える
0

おそらく、正しい読み取りモードでそれを開きますか?

f = open('file.txt','r')
f.readline()
于 2012-05-16T15:06:18.487 に答える