“For line in…”, UnicodeDecodeError ile sonuçlanır: 'utf-8' codec bileşeni bayt kodunu çözemez


215

İşte kodum,

for line in open('u.item'):
#read each line

ne zaman bu kodu çalıştırmak aşağıdaki hatayı verir:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 2892: invalid continuation byte

Bunu çözmek ve open () ekstra bir parametre eklemek için çalıştı, kod gibi görünüyor;

for line in open('u.item', encoding='utf-8'):
#read each line

Ama yine aynı hatayı veriyor. o zaman ne yapmalıyım! Lütfen yardım et.


3
Kötü kodlanmış veri varsayalım.
Andreas Jung

9
Veya UTF-8 verisi değil.
Mark Tolonen


Python 2.7 yerine python 3 kullanırken msgpack ile bu hatayı aldık. Bizim için eylemin yolu python 2.7 ile çalışmaktı.
Jesse W. Collins

Yanıtlar:


404

Mark Ransom'un önerdiği gibi, bu sorun için doğru kodlamayı buldum. Kodlama böylece yerine "ISO-8859-1" idi open("u.item", encoding="utf-8")ile open('u.item', encoding = "ISO-8859-1")sorunu çözecektir.


8
Açık, örtük olmaktan iyidir (PEP 20).
Ioannis Filippidis

6
İşin püf noktası, ISO-8859-1 veya Latin_1 modelinin 8 bit karakter kümesidir, bu nedenle tüm çöplerin geçerli bir değeri vardır. Belki kullanışlı değil, ama görmezden gelmek istiyorsanız!
Kjeld Flarup

1
Aynı sorunu UnicodeDecodeError vardı: 'utf-8' codec bileşeni 32d bayt 0xd0 kodunu çözemez: geçersiz devam bayt. Aws cli kurmak için python 3.6.5 kullandım. Ve aws --version'u denediğimde bu hatayla başarısız oldu. Bu yüzden /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/configparser.py dosyasını düzenlemek zorunda kaldım ve kodu aşağıdaki def read (self, filenames, encoding = "ISO-8859-1" olarak değiştirdim. ):
Евгений Коптюбенко

3
Kodlamayı algılamanın otomatik bir yolu var mı?
OrangeSherbet

5
@OrangeSherbet Kullanarak algılama uyguladım chardet. Burada tek satırlık (peşinde import chardet): chardet.detect(open(in_file, 'rb').read())['encoding']. Ayrıntılar için bu cevaba göz atın: stackoverflow.com/a/3323810/615422
VertigoRay

51

Benim için de çalıştı, ISO 8859-1 çok tasarruf edecek, hahaha, özellikle Konuşma Tanıma API'lerini kullanıyorsa

Misal:

file = open('../Resources/' + filename, 'r', encoding="ISO-8859-1");

4
Hata iletisindeki 0xe9 (é) 'den çıkarılabileceği gibi, OP'nin ISO 8859-1'i okuduğu doğru olabilir, ancak çözümünüzün neden çalıştığını açıklamanız gerekir. Konuşma tanıma API'lerine yapılan başvuru yardımcı olmuyor.
RolfBly

5
Noktalı virgül nedir?
Sağ bacak

29

Dosyanız gerçekten utf-8 kodlanmış veriler içermiyor, başka kodlamalar içeriyor. Bu kodlamanın ne olduğunu bulun ve opençağrıda kullanın .

Örneğin Windows-1252 kodlamasında 0xe9karakter olur é.


4
Peki, hangi kodlamanın olduğunu nasıl öğrenebilirim! Linux kullanıyorum
SujitS

4
Bunun her zaman işe yaradığını yapmanın bir yolu yoktur, ancak bu sorunun cevabına bakın: stackoverflow.com/questions/436220/…
RemcoGerlich

20

Pandaları kullanarak okumak için bunu deneyin

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

Panda'ları neden önerdiğinizden emin değilim. Çözüm, burada geçtiğiniz doğru kodlamayı ayarlamaktır.
Alastair McCormack

12

Eğer kullanıyorsanız Python 2şunları olacak çözüm:

import io
for line in io.open("u.item", encoding="ISO-8859-1"):
    # do something

Çünkü encodingparametre ile çalışmaz open(), aşağıdaki hatayı elde edilecektir:

TypeError: 'kodlama' bu işlev için geçersiz bir anahtar kelime bağımsız değişkenidir

1
Ama bu sürüm 3
SujitS

1
Evet biliyorum. Python 2
Kullanan

Python3'te de
çalıştım

2
Hatırlanması kolay bir şey istiyorsanız, veya 'ISO-8859-1'olarak da bilinir . 'latin-1''latin1'
Max Candocia

9

Sorunu şu şekilde çözebilirsiniz:

for line in open(your_file_path, 'rb'):

'rb' dosyayı ikili modda okuyor. Daha fazlasını buradan okuyun . Umarım bu yardımcı olur!


6

Bu çalışıyor:

open('filename', encoding='latin-1')

veya:

open('filename',encoding="IS0-8859-1")

2

Bunları arayan biri varsa, bu Python 3'te bir CSV dosyasını dönüştürmek için bir örnektir:

try:
    inputReader = csv.reader(open(argv[1], encoding='ISO-8859-1'), delimiter=',',quotechar='"')
except IOError:
    pass

2

Bazen zaman open(filepath)hangi filepathdeğil aslında bir dosya var açık çalışıyoruz emin dosya yapmak o kadar öncelikle aynı hatayı alacağı:

import os
assert os.path.isfile(filepath)

umarım bu yardımcı olur.


1

bu şekilde deneyebilirsiniz:

open('u.item', encoding='utf8', errors='ignore')

Bu soruya bir cevap sağlamaz. Bir yazardan eleştiri veya açıklama istemek için gönderilerinin altına bir yorum bırakın. - Yorumdan
MartenCatcher
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.