Saya menggunakan Python-2.6 CGI
skrip tetapi menemukan kesalahan ini di log server saat melakukan 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
Di sini
__getdata()
mengembalikan fungsi dictionary {}
.
Sebelum posting pertanyaan ini saya telah disebut ini pertanyaan os SO.
PEMBARUAN
Baris berikut ini melukai encoder 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
Saya mendapat perbaikan sementara untuk itu
print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })
Tetapi saya tidak yakin apakah itu cara yang benar untuk melakukannya.
dict
?dict
telahlist, dict, python timestamp value
__getdata
. Saya tidak tahu mengapa Anda mendapatkan karakter yang tidak dapat diterjemahkan. Anda dapat mencoba membuat tambalan pada dikt untuk membuatnya berfungsi, tetapi sebagian besar hanya meminta lebih banyak masalah nanti. Saya akan mencoba mencetak dict untuk melihat di mana karakter non-ascii berada. Kemudian cari tahu bagaimana bidang itu dihitung / ditetapkan dan bekerja mundur dari sana.Jawaban:
Kesalahannya adalah karena ada beberapa karakter non-ascii dalam kamus dan itu tidak dapat dikodekan / didekodekan. Salah satu cara sederhana untuk menghindari kesalahan ini adalah menyandikan string seperti itu dengan
encode()
fungsi sebagai berikut (jikaa
string dengan karakter non-ascii):sumber
Saya beralih ini hanya dengan mendefinisikan paket codec yang berbeda dalam
read_csv()
perintah:encoding = 'unicode_escape'
Misalnya:
sumber
pandas
Coba cuplikan kode di bawah ini:
sumber
r
bukannyarb
. terima kasih atas pengingat untuk ditambahkanb
!open
fungsi memiliki 'r' sebagai mode hanya baca.rb
singkatan mode baca biner.String Anda memiliki
ascii
karakter non- dikodekan di dalamnya.Tidak dapat memecahkan kode
utf-8
dapat terjadi jika Anda perlu menggunakan penyandian lain dalam kode Anda. Sebagai contoh:Dalam hal ini, penyandiannya
windows-1252
harus Anda lakukan:Sekarang
Unicode
, Anda dapat dengan mudah menyandikanutf-8
.sumber
Saat membaca
csv
, saya menambahkan metode penyandian:sumber
Tetapkan pembuat enkode default di bagian atas kode Anda
sumber
Pada 2018-05 ini ditangani langsung dengan
decode
, setidaknya untuk Python 3 .Saya menggunakan cuplikan di bawah ini untuk
invalid start byte
daninvalid continuation byte
mengetik kesalahan. Menambahkanerrors='ignore'
memperbaikinya untuk saya.sumber
Terinspirasi oleh @aaronpenne dan @Soumyaansh
sumber
Solusi ini bekerja untuk saya:
sumber
Solusi sederhana:
sumber
Baris berikut ini melukai encoder JSON
Saya mendapat perbaikan sementara untuk itu
Menandai ini benar sebagai perbaikan sementara (Tidak yakin begitu).
sumber
Jika metode di atas tidak bekerja untuk Anda, Anda mungkin ingin melihat ke dalam mengubah pengkodean file csv itu sendiri.
Menggunakan Excel:
Menggunakan Notepad:
Dengan melakukan ini, Anda seharusnya dapat mengimpor file csv tanpa menemui UnicodeCodeError.
sumber
Setelah mencoba semua solusi yang disebutkan di atas, jika masih menghasilkan kesalahan yang sama, Anda dapat mencoba mengekspor file sebagai CSV (kedua kalinya jika sudah). Terutama jika Anda menggunakan scikit belajar, yang terbaik adalah mengimpor dataset sebagai file CSV.
Saya menghabiskan waktu berjam-jam bersama, sedangkan solusinya sangat sederhana. Ekspor file sebagai CSV ke direktori tempat Anaconda atau alat pengklasifikasi Anda diinstal dan coba.
sumber
Anda dapat menggunakan pengkodean standar untuk penggunaan dan input spesifik Anda.
utf-8
adalah standarnya.iso8859-1
juga populer di Eropa Barat.misalnya:
bytes_obj.decode('iso8859-1')
lihat: docs
sumber
Alih-alih mencari cara untuk mendekode a5 (Yen
¥
) atau 96 (en-dash–
), beri tahu MySQL bahwa klien Anda dikodekan "latin1", tetapi Anda ingin "utf8" dalam database.Lihat detail dalam Masalah dengan karakter UTF-8; apa yang saya lihat bukan apa yang saya simpan
sumber