UnicodeDecodeError สาเหตุและมาตรการรับมือ [Python]

2019 6 年月日 5

เมื่อฉันพยายามอ่านชุดข้อมูลรูปแบบไฟล์ csv ด้วย pandas ฉันพบข้อผิดพลาดทันที "UnicodeDecodeError: 'utf-8' codec can't decode byte 0x91 in position 1: invalid start byte" ฉันจึงถามหาสาเหตุและ วิธีแก้ไข จดบันทึกไว้

เนื้อหาข้อผิดพลาด

อ่านไฟล์ csv ด้วย pd.read_csvแล้ว...

นำเข้าหมีแพนด้าเป็น pd df = pd.read_csv('data.csv')

>> ข้อผิดพลาด UnicodeDecode: ตัวแปลงสัญญาณ 'utf-8' ไม่สามารถถอดรหัสไบต์ 0x91 ในตำแหน่ง 1: ไบต์เริ่มต้นไม่ถูกต้อง

เกิดข้อผิดพลาดในการถอดรหัส Unicode (การแปลงรหัสอักขระเป็นอักขระ)
อย่างไรก็ตาม การแปลงอักขระเป็นรหัสอักขระเรียกว่าการเข้ารหัส

เหตุผล

ภายในคอมพิวเตอร์ อักขระจะไม่ถูกจดจำเหมือนที่เป็นอยู่ แต่จะถูกจัดการเป็นตัวเลข (รหัสอักขระ) ที่กำหนดให้กับอักขระแต่ละตัวล่วงหน้า

มีหลายวิธีในการเข้ารหัสอักขระ ขึ้นอยู่กับภาษาและวิธีการกำหนดหมายเลข UTF-8 เป็นหนึ่งในวิธีการเข้ารหัสสำหรับ Unicode ที่ได้รับการกำหนดเป็นมาตรฐานสากลที่เหมือนกัน เพื่อให้สามารถใช้ในภาษาใดก็ได้
ที่กล่าวว่า UTF-8 ดูเหมือนจะไม่สมบูรณ์แบบเช่นกัน (วิกิพีเดีย:ปัญหา Unicode ในสภาพแวดล้อมของญี่ปุ่น)

ฉันไม่ทราบอักขระที่ทำให้เกิดปัญหา แต่ไฟล์ csv มีอักขระภาษาญี่ปุ่น ดังนั้น ข้อผิดพลาดในการถอดรหัส Unicode จึงเกิดจากการไม่สามารถแปลงรหัสอักขระภาษาญี่ปุ่นและ UTF-8 ได้ดี ดูเหมือนว่า

สารละลาย

เมื่ออ่านด้วย read_csv() ให้ระบุรูปแบบการเข้ารหัสเป็นรหัสอักขระภาษาญี่ปุ่น (เช่น shift_jis) จากอาร์กิวเมนต์

df = pd.read_csv('data.csv', การเข้ารหัส='shift_jis')

มันโหลดได้ดีในขณะนี้

รูปแบบการเข้ารหัสอื่นๆ สำหรับภาษาญี่ปุ่น

อย่างไรก็ตาม มีโค้ดอักขระหลายตัวที่สามารถแสดงภาษาญี่ปุ่นได้ และ Python ใช้สิ่งต่อไปนี้เป็นมาตรฐาน ( อ้างอิง:รายการการเข้ารหัสมาตรฐานของ Python )

  • cp932
  • euc_jp, euc_jis_2004, euc_jisx0213
  • iso2022_jp, iso2022_jp_1, iso2022_jp_2, iso2022_jp_3
  • iso2022_jp_2004, iso2022_jp_2ต่อ
  • shift_jis, shift_jis_2004, shift_jisx0213

อย่างไรก็ตาม ฉันมีความรู้สึกว่ามันสามารถอ่านได้ดีกับ shift_jis หรือ cp932 ซึ่งส่วนใหญ่สำคัญ