質問

私は私が私の単体テストからのトレースバックを得る一連のパーサーに取り組んでいます:

  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>
.

追加のarguemntを使用してopen()で開かれます。追加の引数をopen()に渡すことも、コーデックモジュールで何かを使ってこれらの異なる方法を開くことができますか?

これはPython 2で書かれたコードを思いついて、2to3ツールで3に変換されました。

更新:これはパーサーにzipfileをフィードする結果です。ユニットテストは実際にこれが起こることを期待しています。パーサーは解析できないものとして認識されるべきです。そのため、例外処理を変更する必要があります。今やる過程で。

役に立ちましたか?

解決

位置0x81は、Windows-1252(AKA CP1252)で割り当てられていません。ラテン-1(AKA ISO 8859-1)のU + 0081高オクテットプリセット(HOP)制御文字に割り当てられています。私はこのようなPython 3.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として扱うために、Codeapeの推奨されるようなencoding引数を渡します。

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

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

他のヒント

エラー処理をリラックスできます。

例えば:

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

または:

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

docs

編集:

しかしあなたは問題がファイルを読むことにあることを確信していますか?コンソールに何かが書かれたときに例外が起こることはできますか? http://wiki.python.org/moin/printfails

すべてのファイルは「Unicodeではありません」です。 Unicodeはエンコードされなければならない内部表現です。エンコーディングが使用されているのは、ファイルごとに判断し、ファイルが開かれたときに必要な場合に指定する必要があります。

トレースバックおよびエラーメッセージが問題のファイルはcp1252でエンコードされません。

latin1でエンコードされている場合、それが不満の"\x81"は、名前を付けていないC1制御文字(Unicode)です。 有効になることはほとんどありません。

あなたは「いくつかのファイルはxml.dom.minidomで解析されている」 - 正常に解析されたか失敗したと言いますか?

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

「その他イテラブルとして直接読む」 - サンプルコードをお願いします。

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

他の可能なエンコーディングの手がかり:ファイル内のテキストでどの言語を使用しますか?ファイルをどこから入手しましたか?

注:説明を明確にすることで質問を編集してください。コメントで答えないでください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top