UnicodeDecodeError: ตัวแปลงสัญญาณ 'charmap' ไม่สามารถถอดรหัสไบต์ X ในตำแหน่ง Y: อักขระแผนที่ไปยัง <undefined>


549

ฉันพยายามรับโปรแกรม Python 3 เพื่อทำกิจวัตรกับไฟล์ข้อความที่เต็มไปด้วยข้อมูล อย่างไรก็ตามเมื่อพยายามอ่านไฟล์ฉันได้รับข้อผิดพลาดดังต่อไปนี้:

 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
สำหรับข้อผิดพลาดเดียวกันการแก้ปัญหาเหล่านี้ได้ช่วยฉันแก้ไขข้อผิดพลาด charmap
Shubham Sharma

2
ดูที่การประมวลผลไฟล์ข้อความใน Python 3เพื่อทำความเข้าใจว่าทำไมคุณถึงได้รับข้อผิดพลาดนี้
Andreas Haferburg

คำตอบ:


960

ไฟล์ที่สงสัยไม่ได้ใช้การCP1252เข้ารหัส มันใช้การเข้ารหัสอื่น สิ่งที่คุณต้องคิดออกเอง คนทั่วไปคือLatin-1และUTF-8. ตั้งแต่0x90ไม่จริงอะไรเฉลี่ยในLatin-1, UTF-8(ที่0x90เป็นไบต์ต่อเนื่อง) มีแนวโน้มที่

คุณระบุการเข้ารหัสเมื่อคุณเปิดไฟล์:

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

19
เยี่ยมมากฉันมีปัญหากับโค้ด Python 2.7 บางอันที่ฉันพยายามเรียกใช้ใน Python 3.4 ละติน -1 ทำงานให้ฉัน!
1vand1ng0

2
หากคุณใช้ Python 2.7 และได้รับข้อผิดพลาดเดียวกันให้ลองใช้ioโมดูล:io.open(filename,encoding="utf8")
christopherlovell

9
@ 1vand1ng0: แน่นอนงาน Latin-1; มันจะทำงานกับไฟล์ใด ๆ โดยไม่คำนึงถึงการเข้ารหัสไฟล์ที่แท้จริง นั่นเป็นเพราะค่า 256 ไบต์ที่เป็นไปได้ทั้งหมดในไฟล์นั้นมี codepoint แบบละติน -1 ที่จะแมป แต่นั่นไม่ได้หมายความว่าคุณจะได้รับผลลัพธ์ที่ชัดเจน! หากคุณไม่รู้จักการเข้ารหัสแม้แต่การเปิดไฟล์ในโหมดไบนารีแทนอาจดีกว่าสมมติว่า Latin-1
Martijn Pieters

1
มันเป็น Unicode ตามค่าเริ่มต้น แต่ Unicode ไม่ใช่การเข้ารหัส 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)แม้หลังจากใช้สิ่งนี้ฉันได้รับข้อผิดพลาดเดียวกัน ฉันได้ลองด้วยการเข้ารหัสอื่น ๆ แต่ก็ไร้ประโยชน์ from geotext import GeoTextในรหัสนี้นอกจากนี้ผมยังใช้ กรุณาแนะนำวิธีแก้ปัญหา
Salah

47

เพียงแค่เพิ่มในกรณีที่file = open(filename, encoding="utf8")ไม่ได้ลองfile = open(filename, errors='ignore')


ขอบคุณมากฉันจะลองทำดู มีอักขระที่ไม่ถูกต้องบางส่วนในไฟล์ที่ฉันไม่สนใจ
Stephen Nutt

6
คำเตือน: สิ่งนี้จะส่งผลให้ข้อมูลสูญหายเมื่อพบอักขระที่ไม่รู้จัก (ซึ่งอาจปรับได้ตามสถานการณ์ของคุณ)
Hans Goldman

34

เป็นส่วนขยายของคำตอบของ @ LennartRegebro :

หากคุณไม่สามารถบอกได้ว่าการเข้ารหัสไฟล์ของคุณใช้งานอย่างไรและวิธีการแก้ปัญหาข้างต้นใช้งานไม่ได้ (ไม่ใช่utf8) และคุณพบว่าตัวเองคาดเดา - มีเครื่องมือออนไลน์ที่คุณสามารถใช้เพื่อระบุว่าการเข้ารหัสนั้นคืออะไร พวกเขาไม่สมบูรณ์แบบ แต่มักจะทำงานได้ดี หลังจากที่คุณเข้าใจการเข้ารหัสคุณควรจะสามารถใช้โซลูชันด้านบนได้

แก้ไข: (คัดลอกมาจากความคิดเห็น)

โปรแกรมแก้ไขข้อความที่ได้รับความนิยมมากSublime Textมีคำสั่งให้แสดงการเข้ารหัสหากมีการตั้งค่า ...

  1. ไปที่View-> Show Console(หรือCtrl+ `)

ป้อนคำอธิบายรูปภาพที่นี่

  1. พิมพ์ลงในฟิลด์ที่ด้านล่างview.encoding()และหวังว่าจะดีที่สุด (ฉันไม่สามารถรับอะไรได้ แต่Undefinedแต่บางทีคุณอาจจะโชคดีกว่า ... )

ป้อนคำอธิบายรูปภาพที่นี่


2
เครื่องมือแก้ไขข้อความบางตัวจะให้ข้อมูลนี้เช่นกัน ฉันรู้ว่าด้วยเสียงเรียกเข้าคุณสามารถรับสิ่งนี้ได้ผ่านทาง:set fileencoding( จากลิงค์นี้ )
PaxRomana99

3
Sublime ข้อความยัง - view.encoding()เปิดคอนโซลและประเภท
JimmidyJoo

หรือคุณสามารถเปิดไฟล์ด้วย notepad 'บันทึกเป็น' และคุณจะเห็นรายการแบบหล่นลงพร้อมการเข้ารหัสที่ใช้
don_Gunner94

9

open(filename, 'rb')อีกวิธีหนึ่งคือถ้าคุณไม่จำเป็นต้องถอดรหัสไฟล์เช่นการอัปโหลดไฟล์ไปยังเว็บไซต์ r = reading, b = binary


ขอบคุณที่เป็นกรณีสำหรับปัญหาของฉัน
shahin gh

6

TLDR? ลอง:file = open(filename, encoding='cp437)

ทำไม? เมื่อใช้:

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

Python สมมติว่าไฟล์ใช้เพจรหัสเดียวกันกับสภาพแวดล้อมปัจจุบัน (cp1252 ในกรณีที่โพสต์เปิด) และพยายามถอดรหัสเป็น UTF-8 เริ่มต้นของตัวเอง หากไฟล์มีอักขระที่ไม่ได้กำหนดไว้ในเพจรหัสนี้ (เช่น 0x90) เราจะได้รับ UnicodeDecodeError บางครั้งเราไม่รู้จักการเข้ารหัสไฟล์บางครั้งการเข้ารหัสไฟล์อาจไม่สามารถจัดการได้โดย Python (เช่น cp790) บางครั้งไฟล์อาจมีการเข้ารหัสผสม

หากไม่จำเป็นต้องใช้อักขระดังกล่าวอักขระอาจตัดสินใจแทนที่ด้วยเครื่องหมายคำถามด้วย:

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

วิธีแก้ปัญหาอื่นคือการใช้:

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

อักขระจะถูกทิ้งไว้เหมือนเดิม แต่ข้อผิดพลาดอื่น ๆ จะถูกปิดบังเช่นกัน

ทางออกที่ดีคือการระบุการเข้ารหัส แต่ไม่ใช่การเข้ารหัสใด ๆ (เช่น cp1252) แต่เป็นการเข้ารหัสที่กำหนดอักขระทั้งหมด (เช่น cp437):

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

Codepage 437 เป็นการเข้ารหัส DOS ดั้งเดิม รหัสทั้งหมดถูกกำหนดไว้ดังนั้นจึงไม่มีข้อผิดพลาดในขณะที่อ่านไฟล์ไม่มีข้อผิดพลาดถูกพรางออกอักขระจะถูกรักษาไว้ (ไม่เหลือเหมือนเดิม แต่ยังคงสามารถแยกแยะได้)


1
ว้าวคุณ นี่เป็นการถอดรหัสที่ใช้ได้สำหรับฉันเท่านั้น
สกี้

1

สำหรับผู้ที่ทำงานใน Anaconda ใน Windows ฉันมีปัญหาเดียวกัน Notepad ++ ช่วยฉันแก้ปัญหา

เปิดไฟล์ใน Notepad ++ ที่ด้านล่างขวามันจะบอกคุณเข้ารหัสไฟล์ปัจจุบัน ในเมนูด้านบนถัดจาก "ดู" ค้นหา "การเข้ารหัส" ใน "การเข้ารหัส" ไปที่ "ชุดอักขระ" และที่นั่นด้วยการมองหาการเข้ารหัสที่คุณต้องการ ในกรณีของฉันพบการเข้ารหัส "Windows-1252" ภายใต้ "Western European"


1

หยุดการสูญเสียเวลาของคุณเพียงเพิ่มต่อไปนี้encoding="cp437"และerrors='ignore'รหัสของคุณทั้งในการอ่านและเขียน:

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

โชคดี


แน่นอนครับ รับทราบ. ไม่เสียเวลา ขอบคุณ. คุณต้องการกาแฟหนึ่งถ้วยหรือไวน์รสเลิศหรือไม่?
Pramesh Bajracharya

0

สำหรับฉันการเปลี่ยนตัวละคร Mysql การเข้ารหัสเช่นเดียวกับรหัสของฉันช่วยในการเรียงลำดับทางออก `photo = open ('pic3.png', การเข้ารหัส = latin1), ข้อความที่แข็งแกร่ง ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.