2012-05-07 20 views
16

Bir metin dosyası okunurken bu hatayı alıyorum. Bunu işlemek/göz ardı etmek ve devam etmek mümkün mü?Python 3'ün readlines() ile Unicode hatası kullanımı

UnicodeEncodeError: ‘charmap’ codec can’t decode byte 0x81 in position 7827: character maps to undefined.

+1

Bu, ayrıntılara dayalı olarak bir _lot_'ı değiştirir. Python 2? Python 3? Okunduğunuz dizeleri çözmeyi deniyor musunuz? Nasıl? Etc. –

+0

Python 3. readlines() kullanıyorum – Bob

+0

Tamam - Python 3'ü belirtmek için soruyu güncelledim. Unicode, 2 ile 3 arasında çok büyük farkların olduğu yerlerden biridir; Lütfen ileride açık bir şekilde sürüm belirttiğinizden emin olun. –

cevap

30

sarın dosya nesne oluşturma (örneğin, errors=ignore veya errors=replace gibi), uygun bir errors= değeri geçebileceği (a olmasını varsayılarak io.TextIOWrapper alt sınıfı - ve eğer değilse, birde sarmayı düşünün!); Ayrıca, charmap'dan daha olası bir kodlamayı geçirmeyi düşünün (emin değilseniz, utf-8 her zaman başlangıç ​​için iyi bir yerdir). Örneğin

: read() işlemi sadece byte'lar

f = open('misc-notes.txt', encoding='utf-8', errors='ignore') 
Python 2'de

; daha sonra, onları bir dizgiye dönüştürmek için kod çözme (aslında, baytların aksine karakterleri istiyorsanız). Eğer gerçek kodlama için daha iyi bir tahminde yoksa:

your_string.decode('utf-8', 'replace') 

... karakterlerini işlenmeyen yerine ya

your_string.decode('utf-8', 'ignore') 

sadece onları görmezden. Bu, gerçek kodlamasını bulmak ve kullanmak (utf-8'u tahmin etmek yerine) tercih edilir.

+0

Küçük nitpick: Python 2'de, hile * kodlama değil * kod çözme işlemidir. Ama biliyorsun, çünkü 'decode' yöntemini çağırıyorsun. –

+0

@ThomasK teşekkürler, düzeltildi. –

+0

Tam olarak değil: "şimdi numarayı kodlamak ..." –

-1

Yeah..you, Python 3 bir

try: 
    .... 
except UnicodeEncodeError: 
    pass 
+0

sadece UnicodeEncodeError – cobie

+2

'u yakalıyor, ancak bu, dosyanın geri kalanını okumaya devam etmenin nasıl yapıldığını açıklamak açısından çok işe yaramıyor. –

1

Dosyanın UTF8 olarak yorumlandığından emin olmak için dosyayı bir codec bileşeni ile açmanız gerekir.

 
import codecs 
fd = codecs.open(filename,'r',encoding='utf-8') 
data = fd.read()