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>`
Jawaban:
File yang dimaksud tidak menggunakan
CP1252
penyandian. Itu menggunakan pengkodean lain. Mana yang harus Anda cari tahu sendiri. Yang umum adalahLatin-1
danUTF-8
. Karena 0x90 sebenarnya tidak berarti apa-apaLatin-1
,UTF-8
(di mana 0x90 adalah byte kelanjutan) lebih mungkin.Anda menentukan penyandian saat Anda membuka file:
sumber
io
modul:io.open(filename,encoding="utf8")
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 menggunakanfrom geotext import GeoText
. Mohon saran solusinya.Hanya untuk menambah kalau
file = open(filename, encoding="utf8")
- kalau tidak berhasil cobafile = open(filename, errors='ignore')
sumber
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 Text
memiliki perintah untuk menampilkan pengodean jika sudah diatur ...View
->Show Console
(atau Ctrl+ `)view.encoding()
dan berharap yang terbaik (saya tidak bisa mendapatkan apa punUndefined
tapi mungkin Anda akan memiliki keberuntungan yang lebih baik ...)sumber
:set fileencoding
( dari tautan ini )view.encoding()
.Atau jika Anda tidak perlu men-decode file, seperti mengunggah file ke situs web
open(filename, 'rb')
,. r = membaca, b = binersumber
TLDR? Mencoba:
file = open(filename, encoding='cp437)
Mengapa? Saat digunakan:
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:
Solusi lain adalah menggunakan:
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):
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).
sumber
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"
sumber
Berhentilah membuang waktu Anda, cukup tambahkan yang berikut ini
encoding="cp437"
danerrors='ignore'
ke kode Anda dalam membaca dan menulis:Hasil positif
sumber
bagi saya mengubah karakter Mysql pengkodean sama dengan kode saya membantu memilah solusinya. `photo = open ('pic3.png', encoding = latin1), teks yang kuat
sumber