私は 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
ここで、
関数 __getdata()
は 辞書 {}
を返します。
この質問を掲示する前に私は質問の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つは、以下のように encode()
関数を使用してそのような文字列をエンコードすることである(a
が非アスキー文字を含む文字列の場合):
a.encode('utf-8').strip()
文字列には、非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にエンコードできます。
read csvで、エンコーディングメソッドを追加しました。
import pandas as pd
dataset = pd.read_csv('sample_data.csv',header=0,encoding = 'unicode_escape')
2018-05の時点で、これは[decode
で直接処理され、少なくともPython 3の場合)(https://docs.python.org/3/library/codecs.html#codecs.decode)。。
「無効な開始バイト」および「無効な継続バイト」タイプのエラーを取得した後、以下のスニペットを使用しています。 errors = 'ignore'
を追加すると、修正されました。
with open(out_file, 'rb') as f:
for line in f:
print(line.decode(errors='ignore'))
次の行は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() })
一時的な修正として、これを正しいものとしてマークする(そうとは限らない)。
上記の方法が機能しない場合は、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ファイルをインポートできるはずです。
特定の使用法と入力の標準エンコーディングを使用できます。
「utf-8」がデフォルトです。
「iso8859-1」は西ヨーロッパでも人気があります。
例えば.: bytes_obj.decode( 'iso8859-1')
。
見る: https://docs.python.org/3/library/codecs.html#standard-encodings。