Napraw polskie znaki w Pythonie i pandas

pandas czyta Ä… zamiast ą, przerywa z błędem UnicodeDecodeError albo Excel źle pokazuje wyeksportowany CSV? W Pythonie o wszystkim decyduje parametr encoding. Oto typowe przypadki – a zepsute pliki naprawisz w przeglądarce powyżej.

Działa z tekstem i plikami:

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

Na przykład eksporty z Excela, zrzuty baz danych, napisy do filmów lub kod stron.

Napraw

  1. Przeciągnij plik lub wklej tekst
  2. Naprawa następuje automatycznie
  3. Skopiuj lub pobierz
albo po prostu przeciągnij plik tutaj

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.

CSV z pandas otwarty w Excelu bez BOM

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.

Więcej poradników