UnicodeDecodeError, geçersiz devam baytı


257

Aşağıdaki öğe neden başarısız oluyor? ve neden "latin-1" codec'i ile başarılı oluyor?

o = "a test of \xe9 char" #I want this to remain a string as this is what I am receiving
v = o.decode("utf-8")

sonuç:

 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 0xe9 in position 10: invalid continuation byte

Yanıtlar:


247

İkili olarak, 0xE9 benzer 1110 1001. Wikipedia'da UTF-8 hakkında okursanız , böyle bir baytın ardından iki formun gelmesi gerektiğini görürsünüz 10xx xxxx. Yani mesela:

>>> b'\xe9\x80\x80'.decode('utf-8')
u'\u9000'

Ancak bu sadece istisnanın mekanik nedenidir. Bu durumda, neredeyse kesinlikle latin 1'de kodlanmış bir dizeniz var. UTF-8 ve latin 1'in nasıl farklı göründüğünü görebilirsiniz:

>>> u'\xe9'.encode('utf-8')
b'\xc3\xa9'
>>> u'\xe9'.encode('latin-1')
b'\xe9'

(Not, burada Python 2 ve 3 gösterimlerinin bir karışımını kullanıyorum. Giriş Python'un herhangi bir sürümünde geçerlidir, ancak Python yorumcunuzun bu şekilde hem unicode hem de bayt dizelerini göstermesi olası değildir.)


2
Teşekkürler (ve cevaplanan diğerine), 255'e kadar karakterlerin doğrudan dönüştürüleceğine dair yanlış inanç altındaydım.
RuiDC

Elde UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-3: ordinal not in range(128)kullanarak hatayı.encode(latin-1)
Shiva

236

Panda read_csv yöntemiyle bir csv dosyasını açmaya çalıştığımda aynı hatayla karşılaştım.

Çözüm kodlamayı 'latin-1' olarak değiştirdi:

pd.read_csv('ml-100k/u.item', sep='|', names=m_cols , encoding='latin-1')

1
Bu sorunu gerçekten çözüyor mu? Temel olarak pandalara sadece daha az karmaşık bir kodlama stiline geçerek baytı görmezden gelmelerini söylemiyor mu?
Yu Chen

61

Geçersiz UTF-8. Bu karakter, ISO-Latin1'deki e-akut karakterdir, bu yüzden bu kod kümesiyle başarılı olur.

Dizeleri aldığınız kod kümesini bilmiyorsanız, biraz sorun yaşarsınız. Protokolünüz / uygulamanız için tek bir kod kümesi (umarım UTF-8) seçilirse ve kod çözmeyen kodları reddetmeniz en iyisidir.

Bunu yapamazsan buluşsal yöntemlere ihtiyacın olacak.


2
Buluşsal yöntemler için pazı kütüphanesine bakın.
mlissner

44

UTF-8 çokbaytlı olduğundan ve kombinasyonunuza karşılık gelen bir karakter yoktur. \xe9 artı takip eden alan .

Neden hem utf-8 hem de latin-1'de başarılı olmalı ?

Aynı cümle utf-8'de nasıl olmalıdır:

>>> o.decode('latin-1').encode("utf-8")
'a test of \xc3\xa9 char'

Latin-1 tek bir bayt kodlama ailesidir, bu nedenle içindeki her şey UTF-8'de tanımlanmalıdır. Ama neden bazen Latin-1 kazanır?
18:18 de Reihan_amn

11

Yeni açılmış bir dosyayı işlerken bu hata ortaya çıkarsa, 'rb'modunda açıp açmadığınızı kontrol edin


2
Bu cevap sayesinde, hatasını önlemek başardı UnicodeDecodeError: 'utf-8' codec'i olamaz kod çözme bayt 0xd7 pozisyon 2024079: geçersiz devamı byte ile soup = BeautifulSoup(open('webpage.html', 'rb'), 'html.parser')
Isaac Philip

6

Bir .txtdosyadan İbranice içeren metin okurken bu da bana oldu .

Tıkladım: file -> save asve bu dosyayı UTF-8kodlama olarak kaydettim


5

utf-8 kod hatası genellikle 0 ila 127'yi aşan sayısal değerler aralığı olduğunda ortaya çıkar.

bu istisnayı dile getirme nedeni:

1) Kod noktası <128 ise, her bayt kod noktasının değeri ile aynıdır. 2) Kod noktası 128 veya daha büyükse, Unicode dizesi bu kodlamada temsil edilemez. (Bu durumda Python bir UnicodeEncodeError istisnası oluşturur.)

Bunun üstesinden gelmek için bir dizi kodlamaya sahibiz, en yaygın kullanılanı "Latin-1, ISO-8859-1 olarak da bilinir"

ISO-8859-1 Unicode noktaları 0-255, Latin-1 değerleri ile aynıdır, bu nedenle bu kodlamaya dönüştürmek için kod noktalarını bayt değerlerine dönüştürmek gerekir; 255'ten büyük bir kod noktasıyla karşılaşılırsa, dize Latin-1 olarak kodlanamaz

bir veri kümesi yüklemeye çalışırken bu kural dışı durum oluştuğunda, bu biçimi kullanmayı deneyin

df=pd.read_csv("top50.csv",encoding='ISO-8859-1')

Sözdiziminin sonuna, daha sonra veri kümesini yüklemeyi kabul eden kodlama tekniği ekleyin.


Merhaba ve SO'ya hoş geldiniz! Lütfen bu soruda zaten mevcut olan diğer cevaplar üzerinde geliştiğinden emin olmak için cevabınızı düzenleyin .
hongsy


0

Peki u bu tür bir hata u gibi belirli bir dosya veya veri giriş alırken geliyor:

data=pd.read_csv('/kaggle/input/fertilizers-by-product-fao/FertilizersProduct.csv)

Daha sonra hata şu şekilde görüntüleniyor: - UnicodeDecodeError: 'utf-8' kodeki konum 1'deki bayt 0xf4 kodunu çözemiyor: geçersiz devam baytı

Bu tür hatalardan kaçınmak için bir argüman ekleyerek kaldırılabilir

data=pd.read_csv('/kaggle/input/fertilizers-by-product-fao/FertilizersProduct.csv', encoding='ISO-8859-1')

Lütfen kodunuzu doğru şekilde biçimlendirin, nasıl yapılacağını öğrenmek için burayı tıklayın .
Богдан Опир

-1

Bu durumda, bir yolu / file.sql'yi etkinleştiren bir .py yürütmeye çalıştım.

Benim çözüm file.sql kodunu "BOM olmadan UTF-8" olarak değiştirmek oldu ve işe yarıyor!

Notepad ++ ile yapabilirsiniz.

Kodumun bir kısmını bırakacağım.

/ Kod /

con = psycopg2.connect (ana bilgisayar = sys.argv [1], bağlantı noktası = sys.argv [2], dbname = sys.argv [3], kullanıcı = sys.argv [4], şifre = sys.argv [5] )

cursor = con.cursor () sqlfile = open (yol, 'r')

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.