Як виправити кодування в Python і pandas

pandas читає РџСЂРёРІС–С‚ замість «Привіт», падає з UnicodeDecodeError або Excel показує експортований CSV неправильно? У Python між правильним і зіпсованим текстом вирішує параметр encoding. Нижче типові випадки, а зламані файли можна виправити в браузері вище.

Працює з текстом і файлами:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

Наприклад, вивантаження з Excel і 1С, дампи баз даних, субтитри або код сайтів.

Виправити

  1. Перетягніть файл або вставте текст
  2. Виправлення відбувається автоматично
  3. Скопіюйте або завантажте
або просто перетягніть файл сюди
  • Без надсилання на сервер. Файли виправляються прямо в браузері й не залишають ваш пристрій.

  • Сервери в ЄС. Mojibuster працює на сервері в країні Фінляндія (ЄС), тому діє Загальний регламент про захист даних (GDPR). Текст GDPR (EUR-Lex, англ.)

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 і потім прочитати його.

CSV із pandas, відкритий в Excel без BOM

До

назва,місто,виторг
Іван Шевченко,Київ,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 змінює лише зіпсовані символи. Коми, лапки та переноси рядків залишаються як є.

Інші інструкції