Cara memperbaiki: "UnicodeDecodeError: codec 'ascii' tidak dapat mendekodekan byte"

459
as3:~/ngokevin-site# nano content/blog/20140114_test-chinese.mkd
as3:~/ngokevin-site# wok
Traceback (most recent call last):
File "/usr/local/bin/wok", line 4, in
Engine()
File "/usr/local/lib/python2.7/site-packages/wok/engine.py", line 104, in init
self.load_pages()
File "/usr/local/lib/python2.7/site-packages/wok/engine.py", line 238, in load_pages
p = Page.from_file(os.path.join(root, f), self.options, self, renderer)
File "/usr/local/lib/python2.7/site-packages/wok/page.py", line 111, in from_file
page.meta['content'] = page.renderer.render(page.original)
File "/usr/local/lib/python2.7/site-packages/wok/renderers.py", line 46, in render
return markdown(plain, Markdown.plugins)
File "/usr/local/lib/python2.7/site-packages/markdown/init.py", line 419, in markdown
return md.convert(text)
File "/usr/local/lib/python2.7/site-packages/markdown/init.py", line 281, in convert
source = unicode(source)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 1: ordinal not in range(128). -- Note: Markdown only accepts unicode input!

Bagaimana memperbaikinya?

Di beberapa aplikasi blog statis berbasis python lainnya, pos Cina dapat dipublikasikan dengan sukses. Seperti aplikasi ini: http://github.com/vrypan/bucket3 . Di situs saya http://bc3.brite.biz/ , tulisan berbahasa Mandarin dapat dipublikasikan dengan sukses.

nelayan
sumber

Jawaban:

569

tl; dr / perbaikan cepat

  • Jangan mendekode / menyandikan mau tak mau
  • Jangan menganggap string Anda dikodekan UTF-8
  • Cobalah untuk mengubah string ke string Unicode sesegera mungkin dalam kode Anda
  • Perbaiki lokal Anda: Bagaimana mengatasi UnicodeDecodeError di Python 3.6?
  • Jangan tergoda untuk menggunakan reloadperetasan cepat

Unicode Zen dengan Python 2.x - Versi Panjang

Tanpa melihat sumbernya, sulit untuk mengetahui akar masalahnya, jadi saya harus berbicara secara umum.

UnicodeDecodeError: 'ascii' codec can't decode byteumumnya terjadi ketika Anda mencoba untuk mengubah Python 2.x stryang berisi non-ASCII ke string Unicode tanpa menentukan pengkodean dari string asli.

Singkatnya, string Unicode adalah tipe string Python yang sepenuhnya terpisah yang tidak mengandung pengodean apa pun. Mereka hanya memegang kode titik Unicode dan karena itu dapat menampung titik Unicode dari seluruh spektrum. String berisi teks yang disandikan, beit UTF-8, UTF-16, ISO-8895-1, GBK, Big5 dll. String di-decode ke Unicode dan Unicode di -encode ke string . File dan data teks selalu ditransfer dalam string yang disandikan.

Penulis modul Markdown mungkin menggunakan unicode()(di mana pengecualian dilemparkan) sebagai gerbang kualitas ke sisa kode - itu akan mengkonversi ASCII atau membungkus kembali string Unicodes yang ada ke string Unicode baru. Penulis penurunan harga tidak dapat mengetahui pengkodean string yang masuk sehingga akan bergantung pada Anda untuk mendekode string ke string Unicode sebelum melewati Markdown.

String Unicode dapat dideklarasikan dalam kode Anda menggunakan uawalan ke string. Misalnya

>>> my_u = u'my ünicôdé strįng'
>>> type(my_u)
<type 'unicode'>

String Unicode juga dapat berasal dari file, database, dan modul jaringan. Ketika ini terjadi, Anda tidak perlu khawatir tentang pengkodean.

Gotcha

Konversi dari strke Unicode dapat terjadi bahkan ketika Anda tidak secara eksplisit menelepon unicode().

Skenario berikut menyebabkan UnicodeDecodeErrorpengecualian:

# Explicit conversion without encoding
unicode('€')

# New style format string into Unicode string
# Python will try to convert value string to Unicode first
u"The currency is: {}".format('€')

# Old style format string into Unicode string
# Python will try to convert value string to Unicode first
u'The currency is: %s' % '€'

# Append string to Unicode
# Python will try to convert string to Unicode first
u'The currency is: ' + '€'         

Contohnya

Dalam diagram berikut, Anda dapat melihat bagaimana kata cafétersebut dikodekan dalam pengkodean "UTF-8" atau "Cp1252" tergantung pada jenis terminal. Dalam kedua contoh, cafhanya ascii biasa. Dalam UTF-8, édikodekan menggunakan dua byte. Dalam "Cp1252", é adalah 0xE9 (yang juga merupakan nilai titik Unicode (bukan kebetulan)). Yang benar decode()dipanggil dan konversi ke Python Unicode berhasil: Diagram string yang dikonversi ke string Python Unicode

Dalam diagram ini, decode()dipanggil dengan ascii(yang sama dengan memanggil unicode()tanpa diberikan pengkodean). Karena ASCII tidak dapat memuat byte lebih dari 0x7F, ini akan menghasilkan UnicodeDecodeErrorpengecualian:

Diagram string yang dikonversi ke string Python Unicode dengan pengkodean yang salah

Sandwich Unicode

Ini praktik yang baik untuk membentuk sandwich Unicode dalam kode Anda, tempat Anda mendekode semua data yang masuk ke string Unicode, bekerja dengan Unicode, lalu menyandikan ke strsaat keluar. Ini menyelamatkan Anda dari khawatir tentang pengkodean string di tengah kode Anda.

Input / Dekode

Kode sumber

Jika Anda perlu memanggang non-ASCII ke dalam kode sumber Anda, cukup buat string Unicode dengan awalan string dengan a u. Misalnya

u'Zürich'

Untuk mengizinkan Python mendekode kode sumber Anda, Anda perlu menambahkan header pengodean untuk cocok dengan pengodean sebenarnya dari file Anda. Misalnya, jika file Anda dikodekan sebagai 'UTF-8', Anda akan menggunakan:

# encoding: utf-8

Ini hanya diperlukan ketika Anda memiliki non-ASCII dalam kode sumber Anda .

File

Biasanya data non-ASCII diterima dari file. The iomodul menyediakan TextWrapper yang menerjemahkan file Anda dengan cepat, menggunakan diberi encoding. Anda harus menggunakan penyandian yang benar untuk file - tidak dapat dengan mudah ditebak. Misalnya, untuk file UTF-8:

import io
with io.open("my_utf8_file.txt", "r", encoding="utf-8") as my_file:
     my_unicode_string = my_file.read() 

my_unicode_stringmaka akan cocok untuk diteruskan ke Penurunan harga. Jika a UnicodeDecodeErrordari read()baris, maka Anda mungkin menggunakan nilai penyandian yang salah.

File CSV

Modul Python 2.7 CSV tidak mendukung karakter non-ASCII 😩. Namun, bantuan ada di tangan, dengan https://pypi.python.org/pypi/backports.csv .

Gunakan seperti di atas tetapi berikan file yang dibuka itu:

from backports import csv
import io
with io.open("my_utf8_file.txt", "r", encoding="utf-8") as my_file:
    for row in csv.reader(my_file):
        yield row

Basis data

Sebagian besar driver database Python dapat mengembalikan data dalam Unicode, tetapi biasanya memerlukan sedikit konfigurasi. Selalu gunakan string Unicode untuk kueri SQL.

MySQL

Dalam string koneksi tambahkan:

charset='utf8',
use_unicode=True

Misalnya

>>> db = MySQLdb.connect(host="localhost", user='root', passwd='passwd', db='sandbox', use_unicode=True, charset="utf8")
PostgreSQL

Menambahkan:

psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)

HTTP

Halaman web dapat dikodekan dalam hampir semua pengkodean. The Content-typeheader harus berisi charsetlapangan untuk mengisyaratkan pengkodean. Konten kemudian dapat diterjemahkan secara manual terhadap nilai ini. Atau, Python-Requests mengembalikan Unicodes response.text.

Secara manual

Jika Anda harus mendekode string secara manual, Anda bisa melakukannya my_string.decode(encoding), di mana encodingpengkodean yang sesuai. Python 2.x codec yang didukung diberikan di sini: Penyandian Standar . Sekali lagi, jika Anda mendapatkannya UnicodeDecodeErrormaka Anda mungkin mendapatkan pengkodean yang salah.

Daging sandwich

Bekerja dengan Unicodes seperti yang biasa Anda lakukan strs.

Keluaran

stdout / pencetakan

printmenulis melalui aliran stdout. Python mencoba mengonfigurasi enkoder pada stdout sehingga Unicodes dikodekan ke enkode konsol. Misalnya, jika shell Linux localeadalah en_GB.UTF-8, output akan dikodekan ke UTF-8. Di Windows, Anda akan dibatasi untuk halaman kode 8bit.

Konsol yang dikonfigurasi secara tidak benar, seperti lokal yang korup, dapat menyebabkan kesalahan cetak yang tidak terduga. PYTHONIOENCODINGvariabel lingkungan dapat memaksa pengodean untuk stdout.

File

Sama seperti input, io.opendapat digunakan untuk secara transparan mengkonversi Unicodes ke string byte yang dikodekan.

Basis data

Konfigurasi yang sama untuk membaca akan memungkinkan Unicodes ditulis secara langsung.

Python 3

Python 3 tidak lebih Unicode mampu daripada Python 2.x, namun sedikit kurang bingung pada topik. Misalnya biasa strsekarang menjadi string Unicode dan yang lama strsekarang bytes.

Pengkodean default adalah UTF-8, jadi jika Anda .decode()byte string tanpa memberikan pengkodean, Python 3 menggunakan pengkodean UTF-8. Ini mungkin memperbaiki 50% masalah Unicode orang.

Selanjutnya, open()beroperasi dalam mode teks secara default, sehingga mengembalikan diterjemahkan str(Unicode). Pengkodean berasal dari lokal Anda, yang cenderung UTF-8 pada sistem Un * x atau halaman kode 8-bit, seperti windows-1251, pada kotak Windows.

Mengapa Anda tidak harus menggunakannya sys.setdefaultencoding('utf8')

Ini adalah hack jahat (ada alasan Anda harus menggunakan reload) yang hanya akan menutupi masalah dan menghambat migrasi Anda ke Python 3.x. Pahami masalahnya, perbaiki akar penyebabnya dan nikmati Unicode zen. Lihat Mengapa kita TIDAK menggunakan sys.setdefaultencoding ("utf-8") dalam skrip py? untuk keterangan lebih lanjut

Alastair McCormack
sumber
2
Untuk seseorang yang mencari jawaban Python 2, TLDR yang lebih berguna: gunakan io.openuntuk membaca / menulis file, gunakan from __future__ import unicode_literals, konfigurasikan input / output data lainnya (misalnya, basis data) untuk menggunakan unicode.
idbrii
jadi bagaimana kita memperbaikinya? lol ini bukan masalah dari menulis skrip - ini dari menginstal satu
Matius
@ Matius coba pengaturan PYTHONIOENCODING=utf-8. Jika itu tidak memperbaikinya, Anda harus menghubungi penulis skrip untuk memperbaiki kode mereka.
Alastair McCormack
498

Akhirnya saya mendapatkannya:

as3:/usr/local/lib/python2.7/site-packages# cat sitecustomize.py
# encoding=utf8  
import sys  

reload(sys)  
sys.setdefaultencoding('utf8')

Biarkan saya periksa:

as3:~/ngokevin-site# python
Python 2.7.6 (default, Dec  6 2013, 14:49:02)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.getdefaultencoding()
'utf8'
>>>

Di atas menunjukkan pengkodean default python adalah utf8. Maka kesalahan tidak ada lagi.

nelayan
sumber
7
Saya mencoba ini tetapi tidak dapat mengubah pengkodean secara permanen. Setelah keluar dari konsol python dan mulai lagi, penyandiannya masih sama
macemers
37
Terima kasih! Tetapi mengapa kita perlu memuat ulang sistem setelah mengimpornya?
Dmiters
6
@DmitryNarkevich, karena fungsi setdefaultencoding Illusive . Itu dihapus pada startup Python karena seharusnya tidak pernah menjadi bagian dari rilis yang tepat di tempat pertama, tampaknya.
predi
3
Ini berarti bahwa Anda belum memperbaiki akar penyebabnya. Anda baru saja menambal konversi yang tersirat
Alastair McCormack
5
Pengkodean standar @miraculixx Python 3 adalah UTF-8 dengan string Unicode sebagai default str, sehingga tidak terlambat di sana. Dalam Python 2.x, Unicode berada dalam keadaan transisi, jadi akan berbahaya untuk menganggap pengodean ketika mengkonversi byte ke Unicodes. Oleh karena itu, penyandian standar ASCII dari Py2 adalah pilihan yang disengaja dan mengapa mengubah penyandian default memerlukan retasan yang disengaja untuk memuat ulang sys. Cara yang benar untuk menghalau kesalahan penyandian dalam Py2 adalah dengan mendekodekan string dan penyandian (byte) yang jelas ke Unicode, ketika konversi diperlukan - bukan hanya menganggap string disandikan UTF-8.
Alastair McCormack
130

Ini adalah "masalah unicode" klasik. Saya percaya bahwa menjelaskan ini di luar cakupan jawaban StackOverflow untuk sepenuhnya menjelaskan apa yang terjadi.

Dijelaskan dengan baik di sini .

Dalam ringkasan yang sangat singkat, Anda telah mengirimkan sesuatu yang sedang ditafsirkan sebagai string byte ke sesuatu yang perlu diterjemahkan ke dalam karakter Unicode, tetapi codec default (ascii) gagal.

Presentasi yang saya tunjukkan kepada Anda untuk memberikan saran untuk menghindari hal ini. Jadikan kode Anda "sandwich unicode". Dalam Python 2, penggunaan from __future__ import unicode_literalsbantuan.

Pembaruan: bagaimana kode diperbaiki:

OK - dalam "sumber" variabel Anda, Anda memiliki beberapa byte. Tidak jelas dari pertanyaan Anda bagaimana mereka masuk ke sana - mungkin Anda membacanya dari formulir web? Bagaimanapun, mereka tidak dikodekan dengan ascii, tetapi python sedang mencoba untuk mengubahnya menjadi unicode dengan asumsi mereka. Anda harus secara eksplisit mengatakan apa itu pengkodean. Ini artinya Anda perlu tahu apa itu encoding! Itu tidak selalu mudah, dan itu tergantung sepenuhnya pada dari mana string ini berasal. Anda dapat bereksperimen dengan beberapa penyandian umum - misalnya UTF-8. Anda memberi tahu unicode () pengkodean sebagai parameter kedua:

source = unicode(source, 'utf-8')
GreenAsJade
sumber
1
masih sakit kepala. GreenAsJade, bisakah Anda memberi saya solusi konkret?
nelayan
1
Apakah Anda bertanya "bagaimana saya sebagai pengguna blog ini dapat menghindari masalah ini?". Atau pertanyaan Anda "bagaimana saya bisa memperbaiki kode sehingga masalah ini tidak terjadi"?
GreenAsJade
2
mr greenasjade: di mana saya harus meletakkan "source = unicode (source, 'utf-8')"?
nelayan
7
Aneh ... setelah umpan balik positif selama lebih dari setahun, tiba-tiba dua suara negatif ... Hah?
GreenAsJade
11
gunakan currentFile = open(filename, 'rt', encoding='latin1')atau currentFile = open(filename, 'rt', encoding='utf-8')- lihat di sini: stackoverflow.com/a/23917799/2047442
irudyak
42

Dalam beberapa kasus, ketika Anda memeriksa penyandian default Anda ( print sys.getdefaultencoding()), itu mengembalikan bahwa Anda menggunakan ASCII. Jika Anda mengubah ke UTF-8, itu tidak berfungsi, tergantung pada konten variabel Anda. Saya menemukan cara lain:

import sys
reload(sys)  
sys.setdefaultencoding('Cp1252')
Davy
sumber
ty, ini berhasil untuk masalah saya dengan python melempar UnicodeDecodeError di var = u "" "bervariasi string besar" ""
user2426679
AttributeError: module 'sys' tidak memiliki atribut 'setdefaultencoding'
Chaine
dan reload(sys)digunakan untuk alasan tertentu.
Marcin Orlowski
1
Bekerja untukku! TERIMA KASIH!
Maciej
22

Saya sedang mencari untuk menyelesaikan pesan kesalahan berikut:

unicodedecodeerror: 'ascii' codec tidak dapat mendekode byte 0xe2 di posisi 5454: ordinal tidak dalam jangkauan (128)

Saya akhirnya memperbaikinya dengan menentukan 'encoding':

f = open('../glove/glove.6B.100d.txt', encoding="utf-8")

Semoga itu bisa membantu Anda juga.

Zoe L
sumber
ini memecahkan kesalahan bagi saya ketika membaca / menulis file .csv, tidak memerlukan hal-hal lain yang tercantum dalam jawaban lain
user5359531
Saya tidak mengerti mengapa jawaban lain memberikan banyak detail ... tapi lupakan solusi sederhana ini. +10!
stan0
18
"UnicodeDecodeError: 'ascii' codec can't decode byte"

Penyebab kesalahan ini: input_string harus unicode tetapi str diberikan

"TypeError: Decoding Unicode is not supported"

Penyebab kesalahan ini: mencoba mengubah unicode input_string menjadi unicode


Jadi pertama-tama periksa apakah input_string Anda strdan konversi ke unicode jika perlu:

if isinstance(input_string, str):
   input_string = unicode(input_string, 'utf-8')

Kedua, di atas hanya mengubah jenis tetapi tidak menghapus karakter non ascii. Jika Anda ingin menghapus karakter non-ascii:

if isinstance(input_string, str):
   input_string = input_string.decode('ascii', 'ignore').encode('ascii') #note: this removes the character and encodes back to string.

elif isinstance(input_string, unicode):
   input_string = input_string.encode('ascii', 'ignore')
Aishwarya Subramanian
sumber
9

Saya menemukan yang terbaik adalah untuk selalu mengkonversi ke unicode - tetapi ini sulit dicapai karena dalam praktiknya Anda harus memeriksa dan mengkonversi setiap argumen untuk setiap fungsi dan metode yang pernah Anda tulis yang mencakup beberapa bentuk pemrosesan string.

Jadi saya datang dengan pendekatan berikut untuk menjamin string unicodes atau byte, dari salah satu input. Singkatnya, masukkan dan gunakan lambdas berikut:

# guarantee unicode string
_u = lambda t: t.decode('UTF-8', 'replace') if isinstance(t, str) else t
_uu = lambda *tt: tuple(_u(t) for t in tt) 
# guarantee byte string in UTF8 encoding
_u8 = lambda t: t.encode('UTF-8', 'replace') if isinstance(t, unicode) else t
_uu8 = lambda *tt: tuple(_u8(t) for t in tt)

Contoh:

text='Some string with codes > 127, like Zürich'
utext=u'Some string with codes > 127, like Zürich'
print "==> with _u, _uu"
print _u(text), type(_u(text))
print _u(utext), type(_u(utext))
print _uu(text, utext), type(_uu(text, utext))
print "==> with u8, uu8"
print _u8(text), type(_u8(text))
print _u8(utext), type(_u8(utext))
print _uu8(text, utext), type(_uu8(text, utext))
# with % formatting, always use _u() and _uu()
print "Some unknown input %s" % _u(text)
print "Multiple inputs %s, %s" % _uu(text, text)
# but with string.format be sure to always work with unicode strings
print u"Also works with formats: {}".format(_u(text))
print u"Also works with formats: {},{}".format(*_uu(text, text))
# ... or use _u8 and _uu8, because string.format expects byte strings
print "Also works with formats: {}".format(_u8(text))
print "Also works with formats: {},{}".format(*_uu8(text, text))

Inilah beberapa alasan lain tentang ini .

miraculixx
sumber
Hai, dalam Python 3 fungsi _u itu tidak bekerja dengan nilai ini 'Ita £'.
Martin
1
Oke, dari mana harus memulai dengan "alasan" Anda? print unicode(u'Zürich', encoding="UTF-8")dan kemudian mengeluh "Tapi luar biasa Anda tidak dapat menyandikan unicode ext ke UTF8". unicode()tidak menyandikan; itu diterjemahkan dan Anda tidak dapat men-decode Unicode - sudah diterjemahkan!
Alastair McCormack
@AlastairMcCormack Anda dipersilahkan untuk memperbaiki posting. Namun, jika Anda lebih suka menaburkan superierioritas Anda di atas orang lain yang tidak berbagi pendapat dan wawasan Anda, saya terus terang tidak tertarik. Terima kasih.
miraculixx
3
@miraculixx Maaf, saya tidak bermaksud untuk tampil seperti orang brengsek. Khawatir tentang decoding dan encoding setiap kali Anda menggunakan string dalam kode Anda tidak perlu.
Alastair McCormack
7

Untuk menyelesaikan ini pada tingkat sistem operasi dalam instalasi Ubuntu, periksa hal-hal berikut:

$ locale charmap

Jika Anda mendapatkan

locale: Cannot set LC_CTYPE to default locale: No such file or directory

dari pada

UTF-8

kemudian atur LC_CTYPEdan LC_ALLsukai ini:

$ export LC_ALL="en_US.UTF-8"
$ export LC_CTYPE="en_US.UTF-8"
verva
sumber
6

Encode mengkonversi objek unicode ke objek string. Saya pikir Anda mencoba untuk menyandikan objek string. pertama-tama ubah hasil Anda menjadi objek unicode dan kemudian enkode objek unicode menjadi 'utf-8'. sebagai contoh

    result = yourFunction()
    result.decode().encode('utf-8')
RAFI AFRIDI
sumber
4

Saya memiliki masalah yang sama tetapi tidak berhasil untuk Python 3. Saya mengikuti ini dan itu memecahkan masalah saya:

enc = sys.getdefaultencoding()
file = open(menu, "r", encoding = enc)

Anda harus mengatur penyandian saat Anda membaca / menulis file.

Reihan_amn
sumber
4

Mendapat kesalahan yang sama dan ini menyelesaikan kesalahan saya. Terima kasih! python 2 dan python 3 berbeda dalam penanganan unicode membuat file acar sangat tidak kompatibel untuk memuat. Jadi Gunakan argumen encoding python acar. Tautan di bawah ini membantu saya memecahkan masalah yang sama ketika saya mencoba untuk membuka data acar dari python 3.7 saya, sementara file saya awalnya disimpan dalam versi python 2.x. https://blog.modest-destiny.com/posts/python-2-and-3-compatible-pickle-save-and-load/ Saya menyalin fungsi load_pickle dalam skrip saya dan memanggil load_pickle (pickle_file) saat memuat saya input_data seperti ini:

input_data = load_pickle("my_dataset.pkl")

Fungsi load_pickle ada di sini:

def load_pickle(pickle_file):
    try:
        with open(pickle_file, 'rb') as f:
            pickle_data = pickle.load(f)
    except UnicodeDecodeError as e:
        with open(pickle_file, 'rb') as f:
            pickle_data = pickle.load(f, encoding='latin1')
    except Exception as e:
        print('Unable to load data ', pickle_file, ':', e)
        raise
    return pickle_data
Ganesh Shah
sumber
1
lebih baik untuk memasukkan definisi load_picklefungsi dalam jawaban Anda.
sanyash
4

Ini bekerja untuk saya:

    file = open('docs/my_messy_doc.pdf', 'rb')
saran3h
sumber
3

Singkatnya, untuk memastikan penanganan unicode yang benar di Python 2:

  • gunakan io.openuntuk membaca / menulis file
  • menggunakan from __future__ import unicode_literals
  • konfigurasikan input / output data lainnya (mis. database, jaringan) untuk menggunakan unicode
  • jika Anda tidak dapat mengonfigurasi output ke utf-8, konversikan output Anda untuk utf-8 print(text.encode('ascii', 'replace').decode())

Untuk penjelasan, lihat jawaban terinci @Alastair McCormack .

idbrii
sumber
• gunakan io.open(path, 'r', encoding='utf-8')untuk membaca file yang dikodekan utf-8.
Bob Stein
3

Saya mengalami kesalahan yang sama, dengan URL yang berisi karakter non-ascii (byte dengan nilai> 128), solusi saya:

url = url.decode('utf8').encode('utf-8')

Catatan: utf-8, utf8 hanyalah alias. Hanya menggunakan 'utf8' atau 'utf-8' harus bekerja dengan cara yang sama

Dalam kasus saya, bekerja untuk saya, dalam Python 2.7, saya kira tugas ini mengubah 'sesuatu' dalam strrepresentasi internal - yaitu, memaksa decoding yang tepat dari urutan byte yang didukung urldan akhirnya menempatkan string ke utf-8 str dengan semua keajaiban di tempat yang tepat. Unicode dalam Python adalah ilmu hitam bagi saya. Semoga bermanfaat

Fabiano Tarlao
sumber
1
Mengapa lari dalam satu dan bukan yang lain
IgorGanapolsky
1
Python menerima alias untuk nama penyandian, saya telah mencoba sekarang, dan melakukan hal yang sama ... hanya saja saya belum memperhatikan bahwa saya menulisnya secara berbeda, tambah catatan
Fabiano Tarlao
2

Saya mendapat masalah yang sama dengan string "PastelerÃa Mallorca" dan saya memecahkannya dengan:

unicode("Pastelería Mallorca", 'latin-1')
Alle Pavesi
sumber
1

Dalam proyek Django (1.9.10) / Python 2.7.5 saya sering UnicodeDecodeErrorperkecualian; terutama ketika saya mencoba memberi makan string unicode untuk logging. Saya membuat fungsi pembantu untuk objek yang berubah-ubah pada dasarnya memformat string 8-bit ascii dan mengganti karakter yang tidak ada dalam tabel menjadi '?'. Saya pikir itu bukan solusi terbaik tetapi karena penyandian default adalah ascii (dan saya tidak ingin mengubahnya) ia akan melakukan:

def encode_for_logging (c, encoding = 'ascii'):
    jika isinstance (c, basestring):
        return c.encode (penyandian, 'ganti')
    isif elif (c, Iterable):
        c_ = []
        untuk v dalam c:
            c_.append (encode_for_logging (v, encoding))
        kembali c_
    lain:
        return encode_for_logging (unicode (c))
`

Paul Bormans
sumber
1

Kesalahan ini terjadi ketika ada beberapa karakter non ASCII di string kami dan kami melakukan operasi apa pun pada string itu tanpa decoding yang tepat. Ini membantu saya memecahkan masalah saya. Saya membaca file CSV dengan kolom ID, Teks dan karakter decoding di dalamnya seperti di bawah ini:

train_df = pd.read_csv("Example.csv")
train_data = train_df.values
for i in train_data:
    print("ID :" + i[0])
    text = i[1].decode("utf-8",errors="ignore").strip().lower()
    print("Text: " + text)
Sravya
sumber
0

Ini solusi saya, tambahkan saja encoding. with open(file, encoding='utf8') as f

Dan karena membaca file glove akan memakan waktu lama, saya merekomendasikan file glove ke file numpy. Saat netx Anda membaca bobot embedding, itu akan menghemat waktu Anda.

import numpy as np
from tqdm import tqdm


def load_glove(file):
    """Loads GloVe vectors in numpy array.
    Args:
        file (str): a path to a glove file.
    Return:
        dict: a dict of numpy arrays.
    """
    embeddings_index = {}
    with open(file, encoding='utf8') as f:
        for i, line in tqdm(enumerate(f)):
            values = line.split()
            word = ''.join(values[:-300])
            coefs = np.asarray(values[-300:], dtype='float32')
            embeddings_index[word] = coefs

    return embeddings_index

# EMBEDDING_PATH = '../embedding_weights/glove.840B.300d.txt'
EMBEDDING_PATH = 'glove.840B.300d.txt'
embeddings = load_glove(EMBEDDING_PATH)

np.save('glove_embeddings.npy', embeddings) 

Tautan intisari: https://gist.github.com/BrambleXu/634a844cdd3cd04bb2e3ba3c83aef227

semak duri
sumber
0

Tentukan: # encoding = utf-8 di bagian atas File Python Anda, itu harus memperbaiki masalah

Sameer Kumar Choudhary
sumber