Как да поправите кодировката в Python и pandas

pandas чете Здравей вместо „Здравей“, спира с UnicodeDecodeError или Excel показва експортирания CSV грешно? В Python параметърът encoding решава дали текстът е правилен или повреден. Ето типичните случаи, а повредени файлове можете да поправите направо в браузъра по-горе.

Работи с текст и с тези файлове:

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

Например експорти от Excel и счетоводни програми, архиви на бази данни, субтитри или код на сайтове.

Поправяне

  1. Пуснете файл или поставете текст
  2. Поправката е автоматична
  3. Копирайте или изтеглете
или просто пуснете файл тук

UnicodeDecodeError при четене

pd.read_csv очаква UTF-8. Ако файлът е записан в Windows-1251 (ANSI), pandas спира с UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc7 — 0xC7 е „З“ в Windows-1251. Тогава посочете кодировката:

  • pd.read_csv("data.csv", encoding="cp1251") за файлове от Excel, счетоводни програми и българска Windows.
  • 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" в кодировка без нужните букви, във файла има ? — тогава информацията е загубена, вижте какво е mojibake.

Често задавани въпроси

Има ли библиотека за Python за това?

Да, ftfy поправя mojibake в Python код. За единични файлове без програмиране Mojibuster е по-бърз и показва всяка промяна преди запис.

Кои стойности на encoding ми трябват най-често?

utf-8, utf-8-sig (UTF-8 с BOM), cp1251 (Windows, кирилица), cp866 и utf-16. Малки и главни букви и тирета нямат значение.

Запазват ли се разделителите и числата?

Да. Mojibuster променя само повредените символи. Запетаите, кавичките и новите редове остават точно както са.

Други ръководства