6

私は一連のパーサーに取り組んでおり、次のような単体テストから多数のトレースバックを取得します。

  File "c:\Python31\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 0x81 in position 112: character maps to <undefined>

ファイルはopen()で開かれ、余分な引数はありません。open()に追加の引数を渡すか、コーデックモジュールで何かを使用してこれらを別の方法で開くことはできますか?

これにより、Python 2で記述され、2to3ツールで3に変換されたコードが作成されました。

更新:これは、zipファイルをパーサーにフィードした結果であることがわかりました。単体テストでは、実際にこれが発生することを想定しています。パーサーは、それを解析できないものとして認識する必要があります。したがって、例外処理を変更する必要があります。今それをしている過程で。

4

3 に答える 3

15

位置0x81は、Windows-1252(別名cp1252)では割り当てられていません。これは、Latin-1(別名ISO 8859-1)のU + 0081 HIGH OCTET PRESET(HOP)制御文字に割り当てられています。Python3.1でエラーを次のように再現できます。

>>> b'\x81'.decode('cp1252')
Traceback (most recent call last):
  ...
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 0: character maps to <undefined>

または実際のファイルを使用する場合:

>>> open('test.txt', 'wb').write(b'\x81\n')
2
>>> open('test.txt').read()
Traceback (most recent call last):
  ...
UnicodeDecodeError: 'utf8' codec can't decode byte 0x81 in position 0: unexpected code byte

このファイルをLatin-1として扱うにはencoding、codeapeが提案したように、引数を渡します。

>>> open('test.txt', encoding='latin-1').read()
'\x81\n'

Windows-1257とLatin-1のエンコーディングには違いがあることに注意してください。たとえば、Latin-1には「スマートクォート」がありません。処理しているファイルがテキストファイルの場合は、その\x81がその中で何をしているのかを自問してください。

于 2010-07-19T22:06:24.593 に答える
4

エラー処理を緩和できます。

例えば:

f = open(filename, encoding="...", errors="replace")

または:

f = open(filename, encoding="...", errors="ignore")

ドキュメントを参照してください。

編集:

しかし、問題がファイルの読み取りにあると確信していますか?コンソールに何かが書き込まれたときに例外が発生する可能性がありますか?http://wiki.python.org/moin/PrintFailsを確認してください

于 2010-07-19T20:36:28.273 に答える
2

すべてのファイルは「Unicodeではありません」。Unicodeは、エンコードする必要のある内部表現です。ファイルごとに使用されているエンコーディングを判別し、必要に応じてファイルを開くときにそのエンコーディングを指定する必要があります。

トレースバックとエラーメッセージが示すように、問題のファイルはでエンコードされていませんcp1252

それがでエンコードされている場合latin1"\x81"それが不平を言っているのは、名前さえも持たないC1制御文字です(Unicodeで)。有効である可能性は非常に低いと考えてください。latin1

「一部のファイルはxml.dom.minidomで解析されます」と言いますが、正常に解析されましたか、それとも失敗しましたか?

有効なXMLファイルは最初の行でそのエンコーディング(デフォルトはUTF-8)を宣言する必要があり、コードでエンコーディングを指定する必要はありません。xml.dom.minidom解析を実行するために使用しているコードを表示してください。

「他の人は反復可能として直接読み取ります」-サンプルコードをお願いします。

提案:ブラウザで各タイプのファイルのいくつかを開いてみてください。次に、[表示]をクリックし、[文字エンコード](Firefox)または[エンコード](Internet Explorer)をクリックします。ブラウザは[通常は確実に]どのエンコーディングを推測しましたか?

その他の考えられるエンコーディングの手がかり:ファイルのテキストで使用されている言語は何ですか?どこからファイルを入手しましたか?

注:明確な情報を使用して質問を編集してください。コメントで答えないでください。

于 2010-07-19T22:40:29.723 に答える