Saya mencoba bekerja dengan kumpulan data yang sangat besar yang memiliki beberapa karakter non-standar di dalamnya. Saya perlu menggunakan unicode, sesuai spesifikasi pekerjaan, tetapi saya bingung. (Dan sangat mungkin melakukan semuanya dengan salah.)
Saya membuka CSV menggunakan:
15 ncesReader = csv.reader(open('geocoded_output.csv', 'rb'), delimiter='\t', quotechar='"')
Kemudian, saya mencoba untuk menyandikannya dengan:
name=school_name.encode('utf-8'), street=row[9].encode('utf-8'), city=row[10].encode('utf-8'), state=row[11].encode('utf-8'), zip5=row[12], zip4=row[13],county=row[25].encode('utf-8'), lat=row[22], lng=row[23])
Saya mengkodekan semuanya kecuali lat dan lng karena itu perlu dikirim ke API. Ketika saya menjalankan program untuk mengurai dataset menjadi apa yang dapat saya gunakan, saya mendapatkan Traceback berikut.
Traceback (most recent call last):
File "push_into_db.py", line 80, in <module>
main()
File "push_into_db.py", line 74, in main
district_map = buildDistrictSchoolMap()
File "push_into_db.py", line 32, in buildDistrictSchoolMap
county=row[25].encode('utf-8'), lat=row[22], lng=row[23])
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 2: ordinal not in range(128)
Saya rasa saya harus memberi tahu Anda bahwa saya menggunakan python 2.7.2, dan ini adalah bagian dari aplikasi yang dibangun di atas django 1.4. Saya telah membaca beberapa posting tentang topik ini, tetapi tidak satupun dari mereka yang tampaknya secara langsung berlaku. Bantuan apa pun akan sangat dihargai.
Anda mungkin juga ingin mengetahui bahwa beberapa karakter non-standar yang menyebabkan masalah adalah Ñ dan mungkin É.
Jawaban:
Unicode tidak sama dengan UTF-8. Yang terakhir hanyalah penyandian untuk yang pertama.
Anda melakukannya dengan cara yang salah. Anda membaca UTF-8- dikodekan data, sehingga Anda harus decode UTF-8-encoded String ke dalam string unicode.
Jadi ganti saja
.encode
dengan.decode
, dan itu akan berfungsi (jika .csv Anda dikodekan UTF-8).Tidak ada yang memalukan. Saya yakin 3 dari 5 pemrogram mengalami kesulitan pada awalnya untuk memahami ini, jika tidak lebih;)
Pembaruan: Jika data input Anda tidak dikodekan UTF-8, maka Anda harus
.decode()
dengan pengkodean yang sesuai, tentu saja. Jika tidak ada yang diberikan, python mengasumsikan ASCII, yang jelas gagal pada karakter non-ASCII.sumber
.decode('utf-8')
harus melakukan trik, bukan?Cukup tambahkan baris ini ke kode Anda:
sumber
untuk pengguna Python 3. Anda dapat melakukan
ini bekerja dengan flask juga :)
sumber
Alasan utama kesalahan ini adalah pengkodean default yang diasumsikan oleh python adalah ASCII. Oleh karena itu, jika data string akan dikodekan oleh
encode('utf8')
berisi karakter yang berada di luar rentang ASCII misalnya untuk string seperti 'hgvcj 터 파크 387', python akan menampilkan kesalahan karena string tersebut tidak dalam format pengkodean yang diharapkan.Jika Anda menggunakan versi python sebelum versi 3.5, perbaikan yang dapat diandalkan adalah menyetel pengkodean default yang diasumsikan oleh python ke
utf8
:Dengan cara ini python akan dapat mengantisipasi karakter dalam string yang berada di luar rentang ASCII.
Namun, jika Anda menggunakan python versi 3.5 atau lebih tinggi, fungsi reload () tidak tersedia, jadi Anda harus memperbaikinya menggunakan decode mis.
sumber
Untuk pengguna Python 3:
mengubah pengkodean dari 'ascii' menjadi 'latin1' berfungsi.
Selain itu, Anda dapat mencoba menemukan pengkodean secara otomatis dengan membaca 10.000 byte teratas menggunakan cuplikan di bawah ini:
sumber
Komputer saya memiliki lokasi yang salah.
Saya pertama kali melakukannya
locale.getpreferredencoding(False)
adalah fungsi yang dipanggilopen()
saat Anda tidak menyediakan encoding . Outputnya seharusnya'UTF-8'
, tetapi dalam hal ini adalah beberapa varian ASCII .Lalu saya menjalankan perintah bash
locale
dan mendapatkan output iniJadi, saya menggunakan lokal Ubuntu default, yang menyebabkan Python membuka file sebagai ASCII, bukan UTF-8. Saya harus menyetel lokal saya ke
en_US.UTF-8
Jika Anda tidak dapat mengubah sistem lokal secara luas, Anda dapat memanggil semua kode Python Anda seperti ini:
atau lakukan
untuk mengaturnya di shell tempat Anda menjalankannya.
sumber
jika Anda mendapatkan masalah ini saat menjalankan certbot saat membuat atau memperbarui sertifikat, silakan gunakan metode berikut
grep -r -P '[^\x00-\x7f]' /etc/apache2 /etc/letsencrypt /etc/nginx
Perintah itu menemukan karakter yang melanggar "´" dalam satu file .conf di komentar. Setelah menghapusnya (Anda dapat mengedit komentar sesuai keinginan) dan memuat ulang nginx, semuanya berfungsi kembali.
Sumber: https://github.com/certbot/certbot/issues/5236
sumber
Atau ketika Anda berurusan dengan teks dengan Python jika itu adalah teks Unicode, catat itu adalah Unicode.
Setel
text=u'unicode text'
sajatext='unicode text'
.Ini berhasil dalam kasus saya.
sumber
terbuka dengan encoding UTF 16 karena lat dan long.
sumber
Ia bekerja dengan hanya mengambil argumen 'rb' baca biner daripada 'r' baca
sumber