UnicodeDecodeError: 'utf8'コーデックは位置0のバイト0xa5をデコードできません:無効な開始バイト


188

Python-2.6 CGIスクリプトを使用していますが、実行中にサーバーログにこのエラーが見つかりましたjson.dumps()

Traceback (most recent call last):
  File "/etc/mongodb/server/cgi-bin/getstats.py", line 135, in <module>
    print json.dumps(​​__getdata())
  File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
    return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa5 in position 0: invalid start byte

ここで、

​__get​data()関数はを返しますdictionary {}

この質問を投稿する前に、私はこれを質問os SOについて言及しました。


更新

次の行はJSONエンコーダーを傷つけています、

now = datetime.datetime.now()
now = datetime.datetime.strftime(now, '%Y-%m-%dT%H:%M:%S.%fZ')
print json.dumps({'current_time': now}) // this is the culprit

一時的に修正しました

print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })

しかし、それを行う正しい方法であるかどうかはわかりません。


1
エンコード/デコードできないディクショナリに文字列データがあるようです。何が入ってるのdict
mgilson 2014年

@mgilsonのうんマスター、私は問題を理解し、それに対処する方法をdonno .. dict持っているlist, dict, python timestamp value
ディーパックIngole

1
@パイロット-そうではない。本当の問題はのどこかに埋もれてい__getdataます。なぜデコード不可のキャラクターが表示されるのわかりません。あなたはそれを機能させるためにdictにパッチを考え出すことを試みることができますが、それらはほとんど後でもっと多くの問題を求めているだけです。辞書を印刷して、非ASCII文字がどこにあるかを確認します。次に、そのフィールドがどのように計算/設定され、そこから逆方向に動作するかを理解します。
mgilson 2014年


1
ASCII以外の文字が含まれている.csvファイルを読み取ろうとすると、同じエラーが発生しました。これらの文字を削除すると(以下で推奨)、問題が解決しました。
ドミトリーR.スターソン2017

回答:


87

エラーは、ディクショナリに非ASCII文字が含まれていて、エンコード/デコードできないためです。このエラーを回避する簡単な方法の1つは、そのような文字列をencode()次のように関数でエンコードすることです(a非ASCII文字の文字列の場合)。

a.encode('utf-8').strip()

2
UTF-8は旧式の7ビットASCIIと互換性があるため、すべてをエンコードする必要があります。7ビットASCII範囲の文字の場合、このエンコードはIDマッピングになります。
Tadeusz A.Kadłubowski14年

29
これは明確ではないようです。csvファイルをインポートするとき、このコードをどのように使用しますか?
Dave

sqlalchemyクエリを実行すると同じ問題が発生しますが、クエリをエンコードするにはどうすればよいですか(文字列ではないため、.encodeはありません)?
c8999c 3f964f64

129

read_csv()コマンドで別のコーデックパッケージを定義するだけで、これを切り替えました。

encoding = 'unicode_escape'

例えば:

import pandas as pd
data = pd.read_csv(filename, encoding= 'unicode_escape')

1
使用している場合のみpandas
Valeriy

1
申し訳ありませんが、これは機能しませんでした。同じエラーが再び発生しました。しかし、( 'filename.csv'、engine = 'python')を使用した場合。これはうまくいきました。
basavaraj_S

117

以下のコードスニペットを試してください。

with open(path, 'rb') as f:
  text = f.read()

7
r代わりにしたrb。追加するリマインダーをありがとうb
Paul

1
デフォルトでは、open関数には読み取り専用モードとして「r」があります。rbバイナリ読み取りモードを表します。
シバ

39

文字列にasciiエンコードされた非文字があります。

utf-8コードで他のエンコーディングを使用する必要がある場合、でデコードできないことがあります。例えば:

>>> 'my weird character \x96'.decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 19: invalid start byte

この場合、エンコーディングは次のwindows-1252ようにする必要があります。

>>> 'my weird character \x96'.decode('windows-1252')
u'my weird character \u2013'

これでUnicode、に安全にエンコードできますutf-8


1
予期しない「ミステリーバイト」のエンコードを確立するのに役立つ単純なページを作成しました。tripleee.github.io/8bit
tripleee

34

読み取りcsv時に、エンコーディングメソッドを追加しました。

import pandas as pd
dataset = pd.read_csv('sample_data.csv', header= 0,
                        encoding= 'unicode_escape')

16

コードの上部にデフォルトのエンコーダーを設定する

import sys
reload(sys)
sys.setdefaultencoding("ISO-8859-1")

私はpython3のsysモジュールにsetdefaultencodingがないと思います!
Anwar Hossain

14

2018-05現在、これはdecode少なくともPython 3ではで直接処理されます。

私はのためのスニペットの下に使用していますinvalid start byteinvalid continuation byte型エラー。追加してerrors='ignore'修正しました。

with open(out_file, 'rb') as f:
    for line in f:
        print(line.decode(errors='ignore'))

1
もちろん、これは静かに情報を破棄します。はるかに優れた修正は、そこにあるはずのものを理解し、元の問題を修正することです。
3

14

@aaronpenneと@Soumyaanshに触発されました

f = open("file.txt", "rb")
text = f.read().decode(errors='replace')

「AttributeError: 'str' object has no attribute 'decode'」が表示されました。何が悪かったのかわかりませんか?
ビクターウォン

「rb」にbを含めましたか?bは、バイト形式でファイルを開くためのものです。rだけを使用する場合は文字列であり、decodeを含めないでください。
Punnerud 2018

14

この解決策は私にとってうまくいきました:

import pandas as pd
data = pd.read_csv("training.csv", encoding = 'unicode_escape')

11

簡単な解決策:

import pandas as pd
df = pd.read_csv('file_name.csv', engine='python')

3
助けてくれてありがとう!
ルーベン

@Rubenを助けてくれてうれしい
Gil Baggio

2
これは私を助けてくれてありがとう。私はパンダの作業をしていました。ありがとうございました
basavaraj_S

ヘルプ@basavaraj_Sにハッピー
ギル・バッジョ

1
ここで紹介するすべての方法のうち、私にとっては唯一の解決策です。
ルネスコ

7

次の行はJSONエンコーダーを傷つけています、

now = datetime.datetime.now()
now = datetime.datetime.strftime(now, '%Y-%m-%dT%H:%M:%S.%fZ')
print json.dumps({'current_time': now}) // this is the culprit

一時的に修正しました

print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })

これを一時的な修正として正しいものとしてマークします(確かではありません)。


5

上記の方法がうまくいかない場合は、csvファイル自体のエンコードを変更することを検討してください。

Excelの使用:

  1. Excelを使用してcsvファイルを開く
  2. [ファイルメニュー]オプションに移動し、[名前を付けて保存]をクリックします
  3. 「参照」をクリックして、ファイルを保存する場所を選択します
  4. 目的のファイル名を入力してください
  5. CSV(カンマ区切り)(* .csv)オプションを選択します
  6. [ツール]ドロップダウンボックスをクリックし、[Webオプション]をクリックします
  7. [エンコード]タブで、[このドキュメントを名前を付けて保存]ドロップダウンリストから[Unicode(UTF-8)]オプションを選択します。
  8. ファイルを保存します

メモ帳を使用する:

  1. メモ帳を使用してcsvファイルを開く
  2. [ファイル]> [名前を付けて保存]オプションに移動します
  3. 次に、ファイルの場所を選択します
  4. [ファイルの種類]オプションを[すべてのファイル]として選択します(
  5. 拡張子が.csvのファイル名を指定します
  6. [エンコード]ドロップダウンリストから、UTF-8オプションを選択します。
  7. [保存]をクリックしてファイルを保存します

これにより、UnicodeCodeErrorに遭遇することなくcsvファイルをインポートできるはずです。


2

上記のすべての回避策を試した後も同じエラーが発生する場合は、ファイルをCSVとしてエクスポートしてみてください(すでにお持ちの場合は2回目)。特にscikit learnを使用している場合は、データセットをCSVファイルとしてインポートすることをお勧めします。

私は何時間も一緒に過ごしましたが、解決策はこれほど簡単でした。Anacondaまたは分類ツールがインストールされているディレクトリにCSVとしてファイルをエクスポートし、試してください。


2

特定の使用法と入力の標準エンコーディングを使用できます。

utf-8 デフォルトです。

iso8859-1 西ヨーロッパでも人気があります。

例えば: bytes_obj.decode('iso8859-1')

参照:ドキュメント


1
エンコードを盲目的に推測すると、より多くのエラーが発生する可能性があります。ファイルが使用するエンコーディングを実際に認識せずにiso8859-1やcp1251などを選択すると、この症状は解消されますが、誤って推測した場合は不要な情報が生成されます。ほんの数バイトの場合、実際のエラーに気付き、修正するまでに数年かかる場合があります。
3

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.