UnicodeDecodeError nguyên nhân và biện pháp đối phó [Python]

Ngày 2019 tháng 6 năm 5

Khi tôi cố đọc tập dữ liệu định dạng tệp csv với pandas, tôi ngay lập tức gặp phải lỗi "UnicodeDecodeError: 'utf-8' codec can't decode byte 0x91 in position 1: byte bắt đầu không hợp lệ", vì vậy tôi đã hỏi nguyên nhân và giải pháp. Hãy ghi lại nó.

nội dung lỗi

Đọc tệp csv bằng pd.read_csv.Sau đó...

nhập gấu trúc dưới dạng pdf df = pd.read_csv('data.csv')

>> UnicodeDecodeLỗi: codec 'utf-8' không thể giải mã byte 0x91 ở vị trí 1: byte bắt đầu không hợp lệ

Đã xảy ra lỗi giải mã Unicode (chuyển mã ký tự thành ký tự).
Nhân tiện, việc chuyển đổi ký tự thành mã ký tự được gọi là mã hóa.

Lý do

Bên trong máy tính, các ký tự không được nhận dạng như vốn có mà được xử lý dưới dạng số (mã ký tự) được gán trước cho từng ký tự.

Có nhiều phương pháp để mã hóa ký tự, tùy thuộc vào ngôn ngữ và cách gán số. UTF-8 là một trong những phương pháp mã hóa cho Unicode đã được đặt làm tiêu chuẩn toàn cầu thống nhất để nó có thể được sử dụng trong bất kỳ ngôn ngữ nào.
Điều đó nói rằng, UTF-8 dường như cũng không hoàn hảo (Wikipedia:Các vấn đề về Unicode trong môi trường tiếng Nhật)

Tôi không biết ký tự gây ra sự cố, nhưng tệp csv chứa các ký tự tiếng Nhật nên lỗi giải mã Unicode là do không thể chuyển đổi tốt mã ký tự tiếng Nhật và UTF-8. Có vẻ như vậy

giải pháp

Khi đọc bằng read_csv(), hãy chỉ định định dạng mã hóa dưới dạng mã ký tự tiếng Nhật (chẳng hạn như shift_jis) từ đối số.

df = pd.read_csv('data.csv', encoding='shift_jis')

Nó tải tốt bây giờ.

Các định dạng mã hóa khác cho tiếng Nhật

Nhân tiện, có nhiều mã ký tự có thể diễn đạt tiếng Nhật và Python triển khai mã sau đây làm tiêu chuẩn. ( thẩm quyền giải quyết:Danh sách mã hóa tiêu chuẩn 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_2ext
  • shift_jis, shift_jis_2004, shift_jisx0213

Tuy nhiên, tôi có ấn tượng rằng nó có thể được đọc tốt với shift_jis hoặc cp932, phần lớn là chính.