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()
関数は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() })
しかし、それが正しいやり方かどうかはわかりません。
エラーは、辞書に非ASCII文字が含まれており、それをエンコード/デコードできないためです。このエラーを回避する簡単な方法の1つは、次のようにencode()
関数を使用してそのような文字列をエンコードすることです(a
が非ASCII文字を含む文字列の場合)。
a.encode('utf-8').strip()
以下のコードスニペットを試してください。
with open(path, 'rb') as f: text = f.read()
私はread_csv()
コマンドで異なるコーデックパッケージを定義することでこれを切り替えました
encoding = 'unicode_escape'
あなたの文字列はそれにエンコードされた非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にエンコードすることができます。
AaronpenneとSoumyaanshに触発されました
f = open("file.txt","rb")
text = f.read().decode(errors='replace')
コードの先頭にデフォルトのエンコーダを設定する
import sys
reload(sys)
sys.setdefaultencoding("ISO-8859-1")
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'))
Csvを読むときに私はエンコード方法を追加しました
import pandas as pd
dataset = pd.read_csv('sample_data.csv',header=0,encoding = 'unicode_escape')
次の行は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. 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ファイルをインポートできるはずです。
上記の回避策をすべて試しても同じエラーが発生する場合は、ファイルをCSVとしてエクスポートしてみてください(すでに持っている場合は2回目)。特にscikit learnを使用している場合は、データセットをCSVファイルとしてインポートするのが最善です。
私は何時間も一緒に過ごしましたが、解決策はこれだけでした。 Anacondaまたはあなたの分類ツールがインストールされているディレクトリにCSVとしてファイルをエクスポートしてみてください。
一般的に言って、
不正な種類のオブジェクトをファイルとして読み取ろうとすると、Pythonはそのようなエラーをスローします。
例えば.
file = open("xyz.pkl", "r") text= file.read()
2行目で上記のエラーが発生します。
UnicodeDecodeError: 'utf-8'コーデックは位置0のバイト0x80をデコードできません:開始バイトが無効です
同様の方法で .npy と読み込めば、この種のエラーも発生します。