UnicodeDecodeError przy wczytywaniu
pd.read_csv oczekuje UTF-8. Jeśli plik zapisano w Windows-1250 (ANSI na polskim Windows), pandas przerwie z błędem UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb3 – 0xB3 to ł w Windows-1250. Wtedy podaj kodowanie:
pd.read_csv('dane.csv', encoding='cp1250')dla plików z Excela i polskiego Windows.encoding='iso-8859-2'dla starszych plików z systemów uniksowych i stron WWW.- Jeśli nie znasz kodowania, przeciągnij plik do Mojibuster: rozpozna je i zapisze plik jako UTF-8.
Ä… zamiast ą w DataFrame
Jeśli DataFrame pokazuje Ä…, plik UTF-8 został odczytany jako cp1250 albo latin-1 – lub dane były zepsute już wcześniej. W pierwszym przypadku wystarczy encoding='utf-8'. Jeśli same dane są zepsute, pojedyncze wartości naprawi wartosc.encode('cp1250').decode('utf-8'). Przy danych mieszanych to jednak zawodzi, gdy tylko jakaś komórka jest już poprawna. Łatwiej: napraw plik w Mojibuster, a potem go wczytaj.
Przed
imie,miasto,obrot Żaneta Wójcik,Kraków,1250 zł Zbigniew Kowalski,Gdańsk,980 zł
Po
imie,miasto,obrot Żaneta Wójcik,Kraków,1250 zł Zbigniew Kowalski,Gdańsk,980 zł
to_csv: Excel źle pokazuje plik
df.to_csv('eksport.csv') zapisuje UTF-8 bez BOM. Excel otwiera takie pliki jako ANSI, a polskie litery zamieniają się w Ä… i Ĺ‚. Z encoding='utf-8-sig' pandas dopisze BOM i Excel rozpozna UTF-8. Więcej w artykule o Excelu i krzakach w CSV.
open() w Windows
open('plik.txt') bez encoding używa w Windows kodowania systemowego, na polskim systemie zwykle cp1250. Skrypt, który działa na Linuksie, odczyta wtedy ten sam plik UTF-8 w Windows jako Ä…. Dlatego zawsze podawaj encoding='utf-8' albo ustaw zmienną środowiskową PYTHONUTF8=1. Dzięki PEP 686 UTF-8 stanie się zresztą domyślny w przyszłych wersjach Pythona.
Dane z sieci i requests
requests wyznacza response.text na podstawie nagłówka Content-Type. Jeśli odpowiedź tekstowa nie podaje tam zestawu znaków, biblioteka zakłada ISO-8859-1, a strony w UTF-8 pokazują Ä…. Najpierw ustaw response.encoding = 'utf-8' albo użyj response.json(), które samo rozpoznaje UTF-8.
Jeśli tekst zapisano z errors='replace' w kodowaniu bez potrzebnych liter, plik zawiera ? – wtedy informacja jest utracona, zobacz co to jest mojibake.
Najczęstsze pytania
Czy jest do tego biblioteka Pythona?
Tak, ftfy naprawia mojibake w kodzie Pythona. Przy pojedynczych plikach bez programowania Mojibuster jest szybszy i pokazuje każdą zmianę przed zapisem.
Jakich wartości encoding potrzebuję najczęściej?
utf-8, utf-8-sig (UTF-8 z BOM), cp1250 (Windows, Europa Środkowa), iso-8859-2, latin-1 i utf-16. Wielkość liter i myślniki nie mają znaczenia.
Czy separatory i liczby zostają bez zmian?
Tak. Mojibuster zmienia tylko zepsute znaki. Przecinki, cudzysłowy i podziały wierszy zostają dokładnie takie, jakie były.