1. ホーム
  2. python

[解決済み] UnicodeDecodeError: 'ascii' コーデックは位置 2 のバイト 0xd1 をデコードできません: 序数が range(128) にありません。

2022-09-13 02:08:57

質問

非常に大きなデータセットで、非標準の文字が含まれているものを扱おうとしています。私は仕事の仕様に従って、unicode を使用する必要がありますが、私は困惑しています。(そして、おそらくすべて間違っています)。

を使用して CSV を開きます。

 15     ncesReader = csv.reader(open('geocoded_output.csv', 'rb'), delimiter='\t', quotechar='"')

でエンコードを試みます。

name=school_name.encode('utf-8'), street=row[9].encode('utf-8'), city=row[10].encode('utf-8'), state=row[11].encode('utf-8'), zip5=row[12], zip4=row[13],county=row[25].encode('utf-8'), lat=row[22], lng=row[23])

緯度と経度以外はすべてエンコードしていますが、これはAPIに送信する必要があるからです。データセットを使用できるようにパースするプログラムを実行すると、次のようなトレースバックが発生します。

Traceback (most recent call last):
  File "push_into_db.py", line 80, in <module>
    main()
  File "push_into_db.py", line 74, in main
    district_map = buildDistrictSchoolMap()
  File "push_into_db.py", line 32, in buildDistrictSchoolMap
    county=row[25].encode('utf-8'), lat=row[22], lng=row[23])
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 2: ordinal not in range(128)

私は python 2.7.2 を使っていて、これは django 1.4 で構築されたアプリの一部であることをお伝えする必要があると思います。このトピックに関するいくつかの投稿を読みましたが、どれも直接は当てはまらないようです。どんな助けでも非常に感謝されます。

また、問題を引き起こしている非標準の文字のいくつかは、Ñ とおそらく É であることも知っておきたいかもしれません。

どのように解決するのですか?

UnicodeとUTF-8はイコールではありません。後者は単なる エンコーディング に過ぎません。

あなたは間違った方法でそれを行っています。あなたは 読み UTF-8- エンコード のデータであるため デコード UTF-8でエンコードされた文字列をユニコード文字列に変換する必要があります。

というわけで、単に .encode.decode と入力すれば、うまくいくはずです(.csvがUTF-8でエンコードされている場合)。

恥ずかしがることはありません。5 人中 3 人のプログラマーが、最初はこれを理解するのに苦労したことでしょう (もっとかもしれませんが)。

更新しました。 もし入力データが ではない UTF-8 でエンコードされていない場合、入力データを .decode() を適切なエンコーディングで書かなければなりません。もし何も与えられなければ、pythonはASCIIを仮定し、明らかに非ASCII文字では失敗します。