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 ดั้งเดิม รหัสทั้งหมดถูกกำหนดไว้ดังนั้นจึงไม่มีข้อผิดพลาดในขณะที่อ่านไฟล์ไม่มีข้อผิดพลาดถูกพรางออกอักขระจะถูกรักษาไว้ (ไม่เหลือเหมือนเดิม แต่ยังคงสามารถแยกแยะได้)