UnicodeDecodeError: 'charmap' kodek Y konumunda X baytının kodunu çözemiyor: karakter <defined> ile eşleşiyor


549

Bilgi dolu bir metin dosyası ile bazı manipülasyonlar yapmak için bir Python 3 programı almaya çalışıyorum. Ancak, dosyayı okumaya çalışırken aşağıdaki hatayı alıyorum:

 Traceback (most recent call last):  
     File "SCRIPT LOCATION", line NUMBER, in <module>  
     `text = file.read()`  
     File "C:\Python31\lib\encodings\cp1252.py", line 23, in decode  
     `return codecs.charmap_decode(input,self.errors,decoding_table)[0]`  
     UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 2907500: character maps to `<undefined>`  

2
Aynı hata için bu çözüm bana yardımcı oldu , charmap hatası çözümü
Shubham Sharma

2
Bu hatayı neden aldığınızı anlamak için Python 3'te Metin Dosyalarını İşleme konusuna bakın .
Andreas Haferburg

Yanıtlar:


960

Söz konusu dosya CP1252kodlamayı kullanmıyor . Başka bir kodlama kullanıyor. Hangisini bulmalısın. Ortak olanlar Latin-1ve UTF-8. Yana 0x90 aslında ortalama bir şey yapmaz Latin-1, UTF-8( 0x90 devamı byte) olasılığı daha fazladır.

Kodlamayı dosyayı açtığınızda belirtirsiniz:

file = open(filename, encoding="utf8")

19
Harika, Python 3.4'te çalıştırmayı denediğim bazı Python 2.7 koduyla ilgili bir sorunum vardı. Latin-1 benim için çalıştı!
1vand1ng0

2
Python 2.7 kullanıyorsanız ve aynı hatayı alıyorsanız, şu iomodülü deneyin :io.open(filename,encoding="utf8")
christopherlovell

9
@ 1vand1ng0: elbette Latin-1 çalışıyor; dosyanın gerçek kodlamasının ne olduğuna bakılmaksızın herhangi bir dosya için çalışır. Bunun nedeni, bir dosyadaki 256 olası bayt değerinin hepsinin eşlenecek bir Latin-1 kod noktasına sahip olmasıdır, ancak bu okunabilir sonuçlar alacağınız anlamına gelmez! Kodlamayı bilmiyorsanız, dosyayı ikili modda açmak bile Latin-1 varsaymaktan daha iyi olabilir.
Martijn Pieters

1
Varsayılan olarak unicode'dur, ancak unicode bir kodlama değildir. regebro.wordpress.com/2011/03/23/…
Lennart Regebro

1
filename = "C:\Report.txt" with open(filename,encoding ="utf8") as my_file: text = my_file.read() print(text)Bunu kullandıktan sonra bile aynı hatayı alıyorum. Ayrıca diğer tüm kodlama ile denedim ama hepsi boşuna. Bu kodda da kullanıyorum from geotext import GeoText. Lütfen bir çözüm önerin.
Salah

47

Sadece file = open(filename, encoding="utf8")işe yaramazsa eklemek için deneyinfile = open(filename, errors='ignore')


Çok teşekkürler - bunu bir deneyeceğim. İlgilenmediğim dosyaların bazı bölümlerinde geçersiz karakterler var.
Stephen Nutt

6
Uyarı: Bu, bilinmeyen karakterlerle karşılaşıldığında veri kaybına neden olur (durumunuza bağlı olarak iyi olabilir).
Hans Goldman

34

@ LennartRegebro'nun cevabının bir uzantısı olarak :

Dosyanızın hangi kodlamasını kullandığını söyleyemiyorsanız ve yukarıdaki çözüm işe yaramazsa (işe yaramazsa utf8) ve kendinizi sadece tahmin ederken bulduysanız - hangi kodlamanın olduğunu tanımlamak için kullanabileceğiniz çevrimiçi araçlar vardır. Mükemmel değiller ama genellikle gayet iyi çalışıyorlar. Kodlamayı anladıktan sonra yukarıdaki çözümü kullanabilmeniz gerekir.

EDIT: (Yorumdan kopyalandı)

Oldukça popüler bir metin düzenleyicisinin Sublime Text, ayarlanmışsa kodlamayı görüntüleme komutu vardır ...

  1. View-> Show Console(veya Ctrl+ `) öğesine gidin

resim açıklamasını buraya girin

  1. Alttaki alana yazın view.encoding()ve en iyisini umun (bir şey alamadım Undefinedama belki daha iyi şansınız olacak ...)

resim açıklamasını buraya girin


2
Bazı metin editörleri de bu bilgileri sağlayacaktır. Ben vim ile :set fileencoding( bu linkten ) aracılığıyla alabilirsiniz biliyorum
PaxRomana99

3
Sublime Text, ayrıca - konsolu açın ve yazın view.encoding().
JimmidyJoo

alternatif olarak, dosyanızı not defteri ile açabilirsiniz. 'Farklı Kaydet' ve kullanılan kodlama ile bir açılır
menü görürsünüz

9

Alternatif olarak, dosyayı bir web sitesine yüklemek gibi kodu çözmeniz gerekmiyorsa open(filename, 'rb'). r = okuma, b = ikili


Benim sorunum için teşekkür ederim
shahin gh

6

TLDR? Deneyin:file = open(filename, encoding='cp437)

Neden? Biri kullanıldığında:

file = open(filename)
text = file.read()

Python, dosyanın geçerli ortamla aynı kod sayfasını kullandığını varsayar (açılış yazısı durumunda cp1252) ve kendi varsayılan UTF-8 kodunu çözmeye çalışır. Dosya bu kod sayfasında tanımlanmamış değer karakterleri içeriyorsa (0x90 gibi) UnicodeDecodeError alırız. Bazen dosyanın kodlamasını bilmiyoruz, bazen dosyanın kodlaması Python tarafından işlenmeyebilir (örneğin cp790 gibi), bazen dosya karışık kodlamalar içerebilir.

Bu tür karakterler gereksiz ise, bunları soru işaretleriyle değiştirmeye karar verebilirsiniz:

file = open(filename, errors='replace')

Başka bir geçici çözüm kullanmaktır:

file = open(filename, errors='ignore')

Karakterler daha sonra bozulmadan kalır, ancak diğer hatalar da maskelenir.

Oldukça iyi bir çözüm , kodlamayı belirtmek, ancak herhangi bir kodlamayı (cp1252 gibi) değil, TÜM karakterleri tanımlanmış olanı (cp437 gibi) belirtmektir:

file = open(filename, encoding='cp437')

Kod sayfası 437 özgün DOS kodlamasıdır. Tüm kodlar tanımlanmıştır, bu yüzden dosyayı okurken hiçbir hata yoktur, hiçbir hata maskelenmez, karakterler korunur (oldukça sağlam değil, ancak yine de ayırt edilebilir).


1
Vay canına, teşekkür ederim. Bu benim için tek kod çözme işi.
Kowalski

1

Windows'da Anaconda'da çalışanlar için de aynı problem vardı. Notepad ++ çözmem için bana yardım et.

Dosyayı Notepad ++ ile açın. Sağ altta size geçerli dosya kodlamasını söyleyecektir. Üst menüde, "Görünüm" ün yanında "Kodlama" yı bulun. "Kodlama" da "karakter kümeleri" ne gidin ve orada sabırlı ile ihtiyacınız olan bakıma bakın. Benim durumumda "Windows-1252" kodlaması "Batı Avrupa" altında bulundu


1

Zamanınızı boşa harcamayın, hem okuma hem de yazma işleminde aşağıdakileri encoding="cp437"ve errors='ignore'kodunuza eklemeniz yeterlidir:

open('filename.csv', encoding="cp437", errors='ignore')
open(file_name, 'w', newline='', encoding="cp437", errors='ignore')

Yolun açık olsun


Tabii efendim. Anlaşıldı. Zaman kaybı yok. Teşekkür ederim. Bir fincan kahve ya da kaliteli bir şarap ister misiniz?
Pramesh Bajracharya

0

benim kodumla aynı kodlama Mysql karakteri değiştirmek için çözüm sıralamak için yardımcı oldu. `photo = açık ('pic3.png', kodlama = latin1), güçlü metin resim açıklamasını buraya girin

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.