UnicodeDecodeError khi đọc file
pd.read_csv mong đợi UTF-8. Nếu file lưu theo Windows-1258 (ANSI tiếng Việt) hay Windows-1252, pandas sẽ dừng với UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe0 – 0xE0 là à trong các bảng mã đó. Khi ấy hãy chỉ rõ bảng mã:
pd.read_csv('data.csv', encoding='cp1258')cho file tiếng Việt từ Excel và Windows.encoding='latin-1'không bao giờ báo lỗi nhưng đọc sai nhiều chữ Việt – thường không nên dùng.- Nếu không biết bảng mã, hãy thả file vào Mojibuster: nó tự nhận diện và lưu file thành UTF-8.
á thay cho á trong DataFrame
Nếu DataFrame hiện á hoặc Tiếng, file UTF-8 đã bị đọc theo latin-1 hay cp1252 – hoặc dữ liệu đã hỏng từ trước. Với trường hợp đầu, encoding='utf-8' là đủ. Nếu bản thân dữ liệu hỏng thì value.encode('cp1252').decode('utf-8') giúp được với từng giá trị. Nhưng với dữ liệu trộn lẫn, nó lỗi ngay khi gặp ô vốn đã đúng. Dễ hơn: sửa file bằng Mojibuster rồi hãy đọc.
Trước
tªn,thµnh phè,doanh thu NguyÔn V¨n Hïng,§µ N½ng,1250 TrÇn ThÞ Mai,H¶i Phßng,980
Sau
tên,thành phố,doanh thu Nguyễn Văn Hùng,Đà Nẵng,1250 Trần Thị Mai,Hải Phòng,980
to_csv: Excel hiển thị file sai
df.to_csv('export.csv') ghi UTF-8 không BOM. Excel mở file như vậy theo ANSI, và chữ có dấu thành ký tự lạ. Với encoding='utf-8-sig', pandas ghi thêm BOM và Excel nhận ra UTF-8. Xem thêm lỗi font Excel và CSV.
open() trên Windows
open('file.txt') không có encoding dùng bảng mã hệ thống trên Windows, thường là cp1252 hoặc cp1258. Script chạy tốt trên Linux sẽ đọc cùng file UTF-8 đó thành ký tự vỡ trên Windows. Vì vậy hãy luôn truyền encoding='utf-8' hoặc đặt biến môi trường PYTHONUTF8=1. Theo PEP 686, các phiên bản Python sau này cũng sẽ mặc định dùng UTF-8.
Dữ liệu web với requests
requests suy ra response.text từ tiêu đề Content-Type. Nếu phản hồi dạng văn bản không ghi bộ ký tự ở đó, nó giả định ISO-8859-1 và trang UTF-8 tiếng Việt hiện chữ vỡ. Hãy đặt response.encoding = 'utf-8' trước, hoặc dùng response.json() vì nó tự nhận ra UTF-8.
Nếu văn bản được ghi bằng errors='replace' vào bảng mã thiếu ký tự cần thiết thì file chứa ? – lúc đó thông tin đã mất, xem mojibake là gì. Còn văn bản gõ bằng font cũ như TCVN3 hay VNI thì xem sửa lỗi font tiếng Việt.
Câu hỏi thường gặp
Có thư viện Python nào cho việc này không?
Có, ftfy sửa mojibake trong mã Python. Với từng file đơn lẻ mà không cần lập trình, Mojibuster nhanh hơn và cho bạn xem mọi thay đổi trước khi lưu.
Tôi hay cần những giá trị encoding nào?
utf-8, utf-8-sig (UTF-8 có BOM), cp1258 (Windows tiếng Việt), cp1252, latin-1 và utf-16. Chữ hoa, chữ thường và dấu gạch ngang không quan trọng.
Dấu phân cách và số có được giữ nguyên không?
Có. Mojibuster chỉ đổi những ký tự hỏng. Dấu phẩy, dấu ngoặc kép và ngắt dòng giữ nguyên hoàn toàn.