2

"UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 7338: ordinal not in range(128)"cx_freeze でスクリプトをフリーズした後にプログラムを実行しようとすると、エラーが発生します。Python 3 スクリプトを正常に実行すると正常に動作しますが、フリーズして実行可能ファイルを実行しようとした後にのみ、このエラーが発生します。コードを投稿しますが、投稿する部分が正確にわからないので、特定の部分があれば教えてください。投稿します。そうでない場合は、以前にこの問題が発生して解決したようですそれは、しかし、しばらく経ち、正確に何が問題だったのか、どのように修正したのか思い出せないので、正しい方向に進むための助けや指針が大いに役立ちます. 前もって感謝します。

4

4 に答える 4

2

そのエラー自体は、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
于 2011-05-06T20:55:36.733 に答える
2

デフォルトのコーディングで修正:

reload(sys)
sys.setdefaultencoding("utf-8")
于 2013-04-24T17:12:05.660 に答える
2

どのプラットフォームでどのバージョンの 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別名&nbsp;です...ファイルを編集して、これらを通常のスペースに変更することをお勧めします。

おそらく、cx_freeze メーリング リストで質問して、このエラーが発生する理由について回答を得る必要があります。彼らは完全なトレースバックを知りたがるでしょう。練習してみましょう。ここで見せてください。

ところで、「オフセット 7338」はかなり大きいです -- csv ファイルにそれほど長い行があると思いますか? おそらく何かがあなたのファイルをすべて読んでいます...

于 2011-05-06T21:40:36.903 に答える
1

str.decode()その行に関数を使用します。また、 のようにエンコーディングを指定することもできますmyString.decode('cp1252')

こちらもご覧ください: http://docs.python.org/release/3.0.1/howto/unicode.html#unicode-howto

于 2011-05-06T20:41:59.940 に答える