UnicodeDecodeError під час читання
pd.read_csv чекає UTF-8. Якщо файл збережено у Windows-1251 (ANSI), pandas падає з помилкою UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcf — 0xCF це «П» у Windows-1251. Тоді вкажіть кодування:
pd.read_csv("data.csv", encoding="cp1251")для файлів з Excel, 1С та української Windows.- Для старих файлів із серверів і пошти іноді потрібні
encoding="koi8-u"(KOI8-U) абоencoding="cp866"(DOS). - Якщо кодування невідоме, перетягніть файл у Mojibuster: він визначить його й збереже файл в UTF-8.
РџСЂРёРІС–С‚ замість «Привіт» у DataFrame
Якщо в DataFrame стоїть РџСЂРёРІС–С‚, файл в UTF-8 прочитано як cp1251 — або дані зіпсовано раніше. У першому випадку досить encoding="utf-8". Якщо зіпсовані самі дані, для окремих значень допоможе value.encode("cp1251").decode("utf-8"). На змішаних даних це ламається, щойно комірка вже правильна. Простіше виправити файл у Mojibuster і потім прочитати його.
До
назва,місто,виторг Іван Шевченко,Київ,1250 ₴ Олена Гриценко,Львів,980 ₴
Після
назва,місто,виторг Іван Шевченко,Київ,1250 ₴ Олена Гриценко,Львів,980 ₴
to_csv: Excel показує файл неправильно
df.to_csv("export.csv") пише UTF-8 без BOM. Excel відкриває такі файли як ANSI, і українські літери стають РџСЂРёРІС–С‚. З параметром encoding="utf-8-sig" pandas додасть BOM, і Excel розпізнає UTF-8. Для українського Excel також потрібен sep=";". Докладніше: кракозябри в Excel.
open() у Windows
open("file.txt") без encoding у Windows використовує системне кодування, в українській Windows це зазвичай cp1251. Скрипт, який працює в Linux, у Windows прочитає той самий UTF-8-файл як РџСЂРёРІС–С‚. Тому завжди вказуйте encoding="utf-8" або задайте змінну середовища PYTHONUTF8=1. За PEP 686 UTF-8 стане кодуванням за замовчуванням і в майбутніх версіях Python.
Дані з мережі через requests
requests визначає response.text за заголовком Content-Type. Якщо в текстовій відповіді кодування не вказано, бібліотека припускає ISO-8859-1, і сторінки в UTF-8 показують привіт. Спершу задайте response.encoding = "utf-8" або використайте response.json(): він сам розпізнає UTF-8.
Якщо текст записано з errors="replace" у кодування без потрібних літер, у файлі стоять ?. Тоді інформацію втрачено, докладніше в статті що таке кракозябри.
Часті запитання
Чи є для цього бібліотека на Python?
Так, ftfy виправляє mojibake у коді на Python. Для окремих файлів без програмування швидше Mojibuster: він показує кожну зміну перед збереженням.
Які значення encoding потрібні найчастіше?
utf-8, utf-8-sig (UTF-8 з BOM), cp1251 (Windows, кирилиця), koi8-u, cp866 та utf-16. Регістр і дефіси не важливі.
Чи зберігаються роздільники та числа?
Так. Mojibuster змінює лише зіпсовані символи. Коми, лапки та переноси рядків залишаються як є.