web-dev-qa-db-ja.com

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

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(​​__get​data())
  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のthisを参照しました。


更新情報

次の行は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() })

しかし、それが正しいやり方かどうかはわかりません。

90
Dipak Ingole

エラーは、辞書に非ASCII文字が含まれており、それをエンコード/デコードできないためです。このエラーを回避する簡単な方法の1つは、次のようにencode()関数を使用してそのような文字列をエンコードすることです(aが非ASCII文字を含む文字列の場合)。

a.encode('utf-8').strip()
59
Santosh Ghimire

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

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

私はread_csv()コマンドで異なるコーデックパッケージを定義することでこれを切り替えました

encoding = 'unicode_escape'
32
MSalty

あなたの文字列はそれにエンコードされた非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にエンコードすることができます。

27
JCF

AaronpenneとSoumyaanshに触発されました

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

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

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

2018年5月の時点で、これは decodeで直接処理されます。少なくともPython 3では です。

invalid start byteおよびinvalid continuation byteタイプのエラーが発生した後は、次のスニペットを使用しています。 errors='ignore'を追加して修正しました。

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

Csvを読むときに私はエンコード方法を追加しました

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

次の行は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() })

これを一時的な修正として正しいとマークする(よくわからない)。

3
Dipak Ingole

上記の方法でうまくいかない場合は、csvファイル自体のエンコーディングの変更を検討してください。

Excelを使用する

1. Open csv file using Excel
2. Navigate to "File menu" option and click "Save As"
3. Click "Browse" to select a location to save the file
4. Enter intended filename
5. Select CSV (Comma delimited) (*.csv) option
6. Click "Tools" drop-down box and click "Web Options"
7. Under "Encoding" tab, select the option Unicode (UTF-8) from "Save this document as" drop-down list
8. Save the file

メモ帳を使用する:

1. Open csv file using notepad
2. Navigate to "File" > "Save As" option
3. Next, select the location to the file
4. Select the Save as type option as All Files(*.*)
5. Specify the file name with .csv extension
6. From "Encoding" drop-down list, select UTF-8 option.
7. Click Save to save the file

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

2
Zuo

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

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

1
Sushmita

一般的に言って、

不正な種類のオブジェクトをファイルとして読み取ろうとすると、Pythonはそのようなエラーをスローします。

例えば.

file = open("xyz.pkl", "r") text= file.read()

2行目で上記のエラーが発生します。

UnicodeDecodeError: 'utf-8'コーデックは位置0のバイト0x80をデコードできません:開始バイトが無効です

同様の方法で .npy と読み込めば、この種のエラーも発生します。

0
Priyank Pathak