UnicodeDecodeError: codec 'charmap' tidak dapat mendekodekan byte X di posisi Y: peta karakter ke <undefined>

550

Saya mencoba untuk mendapatkan program Python 3 untuk melakukan manipulasi dengan file teks yang diisi dengan informasi. Namun, ketika mencoba membaca file saya mendapatkan kesalahan berikut:

 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>`  
Eden Crow
sumber
2
Untuk kesalahan yang sama solusi ini telah membantu saya, solusi kesalahan charmap
Shubham Sharma
2
Lihat Memproses File Teks dalam Python 3 untuk memahami mengapa Anda mendapatkan kesalahan ini.
Andreas Haferburg

Jawaban:

961

File yang dimaksud tidak menggunakan CP1252penyandian. Itu menggunakan pengkodean lain. Mana yang harus Anda cari tahu sendiri. Yang umum adalah Latin-1dan UTF-8. Karena 0x90 sebenarnya tidak berarti apa-apa Latin-1, UTF-8(di mana 0x90 adalah byte kelanjutan) lebih mungkin.

Anda menentukan penyandian saat Anda membuka file:

file = open(filename, encoding="utf8")
Lennart Regebro
sumber
19
Keren, saya punya masalah dengan beberapa kode Python 2.7 yang saya coba jalankan di Python 3.4. Latin-1 bekerja untuk saya!
1vand1ng0
2
jika Anda menggunakan Python 2.7, dan mendapatkan kesalahan yang sama, coba iomodul:io.open(filename,encoding="utf8")
christopherlovell
9
@ 1vand1ng0: tentu saja Latin-1 bekerja; itu akan bekerja untuk file apa pun terlepas dari apa pengkodean sebenarnya file tersebut. Itu karena semua 256 nilai byte yang mungkin dalam file memiliki Latin-1 codepoint untuk dipetakan, tetapi itu tidak berarti Anda mendapatkan hasil yang dapat dibaca! Jika Anda tidak tahu penyandian, bahkan membuka file dalam mode biner mungkin lebih baik daripada mengasumsikan Latin-1.
Martijn Pieters
1
Ini unicode secara default, tetapi unicode bukan pengkodean. 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)bahkan setelah menggunakan ini saya mendapatkan kesalahan yang sama. Saya juga sudah mencoba dengan encoding lain tetapi semuanya sia-sia. Dalam kode ini saya juga menggunakan from geotext import GeoText. Mohon saran solusinya.
Salah
47

Hanya untuk menambah kalau file = open(filename, encoding="utf8")- kalau tidak berhasil cobafile = open(filename, errors='ignore')

Declan Nnadozie
sumber
Terima kasih banyak - saya akan coba ini. Ada beberapa karakter yang tidak valid di bagian file yang tidak saya pedulikan.
Stephen Nutt
6
Peringatan: Ini akan menghasilkan kehilangan data ketika karakter yang tidak dikenal ditemukan (yang mungkin baik-baik saja tergantung pada situasi Anda)
Hans Goldman
34

Sebagai perpanjangan dari jawaban @ LennartRegebro :

Jika Anda tidak dapat mengetahui penyandian file yang Anda gunakan dan solusi di atas tidak berfungsi (tidak utf8) dan Anda hanya menebak - ada alat daring yang dapat Anda gunakan untuk mengidentifikasi penyandian apa itu. Mereka tidak sempurna tetapi biasanya berfungsi dengan baik. Setelah mengetahui penyandiannya, Anda harus dapat menggunakan solusi di atas.

EDIT: (Disalin dari komentar)

Editor teks yang cukup populer Sublime Textmemiliki perintah untuk menampilkan pengodean jika sudah diatur ...

  1. Pergi ke View-> Show Console(atau Ctrl+ `)

masukkan deskripsi gambar di sini

  1. Ketik bidang di bagian bawah view.encoding()dan berharap yang terbaik (saya tidak bisa mendapatkan apa pun Undefinedtapi mungkin Anda akan memiliki keberuntungan yang lebih baik ...)

masukkan deskripsi gambar di sini

Matas Vaitkevicius
sumber
2
Beberapa editor teks akan memberikan informasi ini juga. Saya tahu bahwa dengan vim Anda bisa mendapatkan ini melalui :set fileencoding( dari tautan ini )
PaxRomana99
3
Teks Sublim, juga - buka konsol dan ketik view.encoding().
JimmidyJoo
sebagai alternatif, Anda dapat membuka file Anda dengan notepad. 'Save As' dan Anda akan melihat drop-down dengan pengkodean yang digunakan
don_Gunner94
9

Atau jika Anda tidak perlu men-decode file, seperti mengunggah file ke situs web open(filename, 'rb'),. r = membaca, b = biner

Kyle Parisi
sumber
Terima kasih, itulah masalahnya untuk masalah saya
shahin gh
6

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

Mengapa? Saat digunakan:

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

Python menganggap file tersebut menggunakan codepage yang sama dengan lingkungan saat ini (cp1252 jika ada tulisan pembuka) dan mencoba mendekodekannya ke default UTF-8. Jika file berisi karakter nilai yang tidak didefinisikan dalam codepage ini (seperti 0x90), kami mendapatkan UnicodeDecodeError. Terkadang kita tidak tahu penyandian file, terkadang penyandian file mungkin tidak ditangani oleh Python (seperti misalnya cp790), kadang-kadang file tersebut dapat berisi penyandian campuran.

Jika karakter tersebut tidak dibutuhkan, seseorang dapat memutuskan untuk menggantinya dengan tanda tanya, dengan:

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

Solusi lain adalah menggunakan:

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

Karakter kemudian dibiarkan utuh, tetapi kesalahan lainnya akan ditutup juga.

Solusi yang cukup baik adalah dengan menentukan pengkodean, namun bukan pengkodean apa pun (seperti cp1252), tetapi yang memiliki SEMUA karakter yang ditentukan (seperti cp437):

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

Codepage 437 adalah penyandian DOS asli. Semua kode didefinisikan, sehingga tidak ada kesalahan saat membaca file, tidak ada kesalahan yang ditutup-tutupi, karakter dipertahankan (tidak cukup dibiarkan utuh tetapi masih dapat dibedakan).

rha
sumber
1
Wow, terima kasih. Ini adalah satu-satunya cara decoding untukku.
Kowalski
1

Bagi mereka yang bekerja di Anaconda di Windows, saya memiliki masalah yang sama. Notepad ++ membantu saya menyelesaikannya.

Buka file di Notepad ++. Di kanan bawah itu akan memberi tahu Anda pengkodean file saat ini. Di menu atas, di sebelah "Lihat" cari "Pengkodean". Dalam "Pengkodean" pergi ke "set karakter" dan di sana dengan sabar mencari enconding yang Anda butuhkan. Dalam kasus saya, penyandian "Windows-1252" ditemukan di bawah "Eropa Barat"

Antoni
sumber
1

Berhentilah membuang waktu Anda, cukup tambahkan yang berikut ini encoding="cp437"dan errors='ignore'ke kode Anda dalam membaca dan menulis:

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

Hasil positif

E.Zolduoarrati
sumber
Tentu pak Diterima. Tidak ada waktu yang terbuang. Terima kasih. Apakah Anda ingin secangkir kopi atau anggur berkualitas?
Pramesh Bajracharya
0

bagi saya mengubah karakter Mysql pengkodean sama dengan kode saya membantu memilah solusinya. `photo = open ('pic3.png', encoding = latin1), teks yang kuat masukkan deskripsi gambar di sini

Piyush raj
sumber