Saya menggunakan Python-2.6 CGI
script ini error di log server saat melakukan json.kesedihan()
,
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
Di sini ,
__getdata()
kembali fungsi kamus {}
.
Sebelum posting pertanyaan ini saya telah dirujuk ini pertanyaan os JADI.
Baris berikut adalah menyakiti JSON encoder,
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
Aku memperbaiki sementara untuk itu
print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })
Tapi saya tidak yakin apakah itu cara yang benar untuk melakukannya.
Kesalahan ini karena ada beberapa karakter non-ascii di kamus dan dapat't akan dikodekan/diterjemahkan. Salah satu cara sederhana untuk menghindari kesalahan ini adalah untuk mengkodekan string tersebut dengan encode()
fungsi sebagai berikut (jika a
adalah string dengan karakter non-ascii):
a.encode('utf-8').strip()
String anda memiliki non-ascii karakter dikodekan di dalamnya.
Tidak mampu untuk men-decode dengan utf-8 mungkin terjadi jika anda've diperlukan untuk menggunakan pengkodean lainnya dalam kode anda. Misalnya:
>>> '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
Dalam hal ini, encoding adalah windows-1252 jadi yang harus anda lakukan:
>>> 'my weird character \x96'.decode('windows-1252')
u'my weird character \u2013'
Sekarang bahwa anda memiliki unicode, anda dapat dengan aman encode ke utf-8.
Baca csv saya menambahkan sebuah metode pengkodean:
import pandas as pd
dataset = pd.read_csv('sample_data.csv',header=0,encoding = 'unicode_escape')
Sebagai 2018-05 ini ditangani langsung dengan decode
, setidaknya untuk Python 3.
I'm menggunakan berikut cuplikan setelah mendapatkan tidak valid mulai byte
dan tidak valid kelanjutan byte
jenis kesalahan. Menambahkan kesalahan='mengabaikan'
tetap untuk saya.
with open(out_file, 'rb') as f:
for line in f:
print(line.decode(errors='ignore'))
Baris berikut adalah menyakiti JSON encoder,
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
Aku memperbaiki sementara untuk itu
print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })
Menandai ini sebagai benar sebagai temporary fix (Tidak yakin).
Jika metode di atas tidak bekerja untuk anda, anda mungkin ingin melihat ke dalam mengubah encoding file csv itu sendiri.
Menggunakan Excel:
Menggunakan Notepad:
Dengan melakukan ini, anda harus mampu mengimpor file csv tanpa menghadapi UnicodeCodeError.
Setelah mencoba semua tersebut workarounds, jika masih melempar kesalahan yang sama, anda dapat mencoba mengekspor file CSV (untuk yang kedua kalinya jika anda sudah memiliki). Terutama jika anda're menggunakan scikit belajar, yang terbaik adalah untuk mengimpor data sebagai file CSV.
Aku menghabiskan berjam-jam bersama-sama, sedangkan larutan yang sederhana ini. Ekspor sebagai file CSV ke direktori di mana Anaconda atau anda classifier alat yang dipasang dan mencoba.
Anda dapat menggunakan standar pengkodean tertentu dan penggunaan input.
"utf-8" adalah default.
"iso8859-1" ini juga populer untuk Eropa Barat.
misalnya: bytes_obj.decode('iso8859-1')
lihat: https://docs.python.org/3/library/codecs.html#standard-encodings