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 и после да го прочетете.
Преди
име,град,оборот Здравко Йорданов,Шумен,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 променя само повредените символи. Запетаите, кавичките и новите редове остават точно както са.