"UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 7338: ordinal not in range(128)"
cx_freeze でスクリプトをフリーズした後にプログラムを実行しようとすると、エラーが発生します。Python 3 スクリプトを正常に実行すると正常に動作しますが、フリーズして実行可能ファイルを実行しようとした後にのみ、このエラーが発生します。コードを投稿しますが、投稿する部分が正確にわからないので、特定の部分があれば教えてください。投稿します。そうでない場合は、以前にこの問題が発生して解決したようですそれは、しかし、しばらく経ち、正確に何が問題だったのか、どのように修正したのか思い出せないので、正しい方向に進むための助けや指針が大いに役立ちます. 前もって感謝します。
4 に答える
そのエラー自体は、Python 文字列に通常の ASCII 文字ではない文字があることを示しています。
>>> b'abc\xa0'.decode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 3: ordinal not in range(128)
スクリプトがフリーズしているときにのみこれが発生する理由は確かにわかりません。スクリプト全体をtry
/except
で囲み、問題の文字列の全部または一部を手動で出力できます。
編集:これがどのように見えるかです
try:
# ... your script here
except UnicodeDecodeError as e:
print("Exception happened in string '...%s...'"%(e.object[e.start-50:e.start+51],))
raise
デフォルトのコーディングで修正:
reload(sys)
sys.setdefaultencoding("utf-8")
どのプラットフォームでどのバージョンの Python を使用しているかを正確に教えてください。
エラーが発生したときに取得する完全なトレースバックを表示します。自分で見てください。表示されるコードの最後の行は何ですか? bytes
デコードされている文字列は何だと思いますか? なぜascii
コーデックが使用されているのですか??
デフォルトのコーデック (ascii など) を使用した への自動変換は、Python 3.x では行われないことにbytes
注意してください。str
つまり、明示的に実行しているか、cx_freeze を実行しているかのどちらかです。
コメントで詳細情報を更新してください。
Excel は csv ファイルを ASCII で保存しません。MS が「ANSI コードページ」と呼んでいるもので保存されますが、これはロケールによって異なります。自分のものがわからない場合は、おそらくcp1252
. 確認するには、次のようにします。
>>> import locale; print(locale.getpreferredencoding())
cp1252
Excel がファイルを ASCII で保存した場合、問題の'\xa0'
バイトは「?」に置き換えられます。UnicodeDecodeError を取得することはありません。
ファイルを保存するには、UTF-8
ファイルを開く必要がencoding='utf8'
あり、同じ問題が発生します (0xa0 ではなく 0xc2 について不平を言うことを除いて)。
4 つの csv ファイルすべてを Web に投稿する必要はありません。この小さなスクリプトを実行するだけです (未テスト):
import sys
for filename in sys.argv[1:]:
for lino, line in enumerate(open(filename), 1):
if '\xa0' in line:
print(ascii(filename), lino, ascii(line))
これ'\xa0'
はNO-BREAK SPACE
別名
です...ファイルを編集して、これらを通常のスペースに変更することをお勧めします。
おそらく、cx_freeze メーリング リストで質問して、このエラーが発生する理由について回答を得る必要があります。彼らは完全なトレースバックを知りたがるでしょう。練習してみましょう。ここで見せてください。
ところで、「オフセット 7338」はかなり大きいです -- csv ファイルにそれほど長い行があると思いますか? おそらく何かがあなたのファイルをすべて読んでいます...
str.decode()
その行に関数を使用します。また、 のようにエンコーディングを指定することもできますmyString.decode('cp1252')
。
こちらもご覧ください: http://docs.python.org/release/3.0.1/howto/unicode.html#unicode-howto