Korzystam z programu, który przetwarza 30 000 podobnych plików. Losowa ich liczba zatrzymuje się i wyświetla ten błąd ...
File "C:\Importer\src\dfman\importer.py", line 26, in import_chr
data = pd.read_csv(filepath, names=fields)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 400, in parser_f
return _read(filepath_or_buffer, kwds)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 205, in _read
return parser.read()
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 608, in read
ret = self._engine.read(nrows)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 1028, in read
data = self._reader.read(nrows)
File "parser.pyx", line 706, in pandas.parser.TextReader.read (pandas\parser.c:6745)
File "parser.pyx", line 728, in pandas.parser.TextReader._read_low_memory (pandas\parser.c:6964)
File "parser.pyx", line 804, in pandas.parser.TextReader._read_rows (pandas\parser.c:7780)
File "parser.pyx", line 890, in pandas.parser.TextReader._convert_column_data (pandas\parser.c:8793)
File "parser.pyx", line 950, in pandas.parser.TextReader._convert_tokens (pandas\parser.c:9484)
File "parser.pyx", line 1026, in pandas.parser.TextReader._convert_with_dtype (pandas\parser.c:10642)
File "parser.pyx", line 1046, in pandas.parser.TextReader._string_convert (pandas\parser.c:10853)
File "parser.pyx", line 1278, in pandas.parser._string_box_utf8 (pandas\parser.c:15657)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xda in position 6: invalid continuation byte
Źródło / tworzenie tych plików pochodzą z tego samego miejsca. Jak najlepiej to naprawić, aby kontynuować importowanie?
cp1252
może być lepszym rozwiązaniemiso-8859-1
.pd.read_csv('immigration.csv', encoding = "ISO-8859-1", engine='python')
działało dla mnieANSI
. Aby to rozgryźć, otworzyłem plik csv,notepad
a następnie kliknąłemsave as
, tam pokazuje kodowanie obok przycisku Zapisz.Najprostsze ze wszystkich rozwiązań:
Alternatywne rozwiązanie:
Następnie możesz normalnie odczytać plik:
a inne różne typy kodowania to:
źródło
encoding='iso-8859-1'
użyciu, zamiast tegoengine='python'
rzuca_csv.Error: field larger than field limit (131072)
.Pandy pozwalają określić kodowanie, ale nie pozwalają ignorować błędów, aby nie zastępować automatycznie bajtów. Dlatego nie ma jednego rozmiaru pasującego do wszystkich metod, ale różne sposoby w zależności od rzeczywistego przypadku użycia.
Znasz kodowanie i w pliku nie ma błędu kodowania. Świetnie: musisz tylko określić kodowanie:
Nie chcesz zajmować się kodowaniem pytań, a chcesz tylko załadować ten cholerny plik, bez względu na to, czy niektóre pola tekstowe zawierają śmieci. Ok, musisz tylko użyć
Latin1
kodowania, ponieważ akceptuje on każdy możliwy bajt jako dane wejściowe (i przekształca go na znak Unicode tego samego kodu):Wiesz, że większość pliku jest napisana z określonym kodowaniem, ale zawiera także błędy kodowania. Przykładem świata rzeczywistego jest plik UTF8, który został edytowany za pomocą edytora innego niż utf8 i który zawiera niektóre wiersze z innym kodowaniem. Pandy nie przewidują specjalnego przetwarzania błędów, ale
open
funkcja Pythona ma (zakładając, że Python3) iread_csv
akceptuje obiekt podobny do pliku. Typowym parametrem błędów, który należy tutaj zastosować, jest'ignore'
po prostu tłumienie obrażających bajtów lub (lepiej IMHO),'backslashreplace'
które zastępują obrażające bajty sekwencją ucieczki ich odwrotnej sekwencji w Pythonie:źródło
po wykonaniu tego kodu znajdziesz kodowanie pliku „filename.csv”, a następnie wykonaj kod w następujący sposób
proszę bardzo
źródło
W moim przypadku plik ma
USC-2 LE BOM
kodowanie, zgodnie z Notepad ++. To jestencoding="utf_16_le"
dla pytona.Mam nadzieję, że pomaga komuś znaleźć odpowiedź nieco szybciej.
źródło
W moim przypadku działało to dla Pythona 2.7:
A dla Pythona 3 tylko:
źródło
Spróbuj podać silnik = „python”. To działało dla mnie, ale wciąż próbuję dowiedzieć się, dlaczego.
źródło
Zamieszczam odpowiedź, aby podać zaktualizowane rozwiązanie i wyjaśnienie, dlaczego ten problem może wystąpić. Załóżmy, że otrzymujesz te dane z bazy danych lub skoroszytu programu Excel. Jeśli masz znaki specjalne, np.
La Cañada Flintridge city
Jeśli nie eksportujesz danych za pomocąUTF-8
kodowania, wprowadzisz błędy.La Cañada Flintridge city
stanie sięLa Ca\xf1ada Flintridge city
. Jeśli używaszpandas.read_csv
bez korekty parametrów domyślnych, trafi się następujący błądNa szczęście istnieje kilka rozwiązań.
Opcja 1 , napraw eksport. Pamiętaj, aby użyć
UTF-8
kodowania.Wariant 2 , jeżeli ustalenie problemu wywozu nie jest dostępna dla Ciebie i trzeba użyć
pandas.read_csv
, należy pamiętać o następujących paramters,engine='python'
. Domyślnie panda używa,engine='C'
co jest świetne do czytania dużych, czystych plików, ale zawiesza się, gdy pojawi się coś nieoczekiwanego. Z mojego doświadczeniaencoding='utf-8'
wynika , że ustawienie nigdy tego nie naprawiłoUnicodeDecodeError
. Nie musisz też korzystać z tej opcjierrors_bad_lines
, ale nadal jest to opcja, jeśli NAPRAWDĘ jej potrzebujesz.Opcja 3: rozwiązanie jest moim preferowanym rozwiązaniem osobiście. Przeczytaj plik przy użyciu waniliowego Pythona.
Mam nadzieję, że pomoże to ludziom napotkać ten problem po raz pierwszy.
źródło
Zmagałem się z tym przez chwilę i pomyślałem, że opublikuję to pytanie, ponieważ jest to pierwszy wynik wyszukiwania. Dodanie
encoding="iso-8859-1"
znacznika do pandread_csv
nie działało, podobnie jak żadne inne kodowanie, nadal powodowało błąd UnicodeDecodeError.Jeśli przekazujesz uchwyt pliku
pd.read_csv(),
, musiszencoding
otworzyć atrybut pliku, a nie w nimread_csv
. Oczywiste z perspektywy czasu, ale subtelny błąd do wyśledzenia.źródło
Spróbuj dodać
To pomoże. Pracował dla mnie. Upewnij się również, że używasz prawidłowego separatora i nazw kolumn.
Możesz rozpocząć od załadowania zaledwie 1000 wierszy, aby szybko załadować plik.
źródło
Ta odpowiedź wydaje się być najważniejsza w przypadku problemów z kodowaniem CSV. Jeśli masz dziwny problem z kodowaniem w nagłówku, taki jak ten:
Następnie masz znak bajtu (BOM) na początku pliku CSV. Ta odpowiedź rozwiązuje problem:
Python czyta csv - BOM osadzony w pierwszym kluczu
Rozwiązaniem jest załadowanie pliku CSV z
encoding="utf-8-sig"
:Mam nadzieję, że to komuś pomaga.
źródło
Publikuję aktualizację do tego starego wątku. Znalazłem jedno rozwiązanie, które działało, ale wymaga otwarcia każdego pliku. Otworzyłem plik csv w LibreOffice, wybrałem Zapisz jako> edytuj ustawienia filtra. W menu rozwijanym wybrałem kodowanie UTF8. Następnie dodałem
encoding="utf-8-sig"
dodata = pd.read_csv(r'C:\fullpathtofile\filename.csv', sep = ',', encoding="utf-8-sig")
.Mam nadzieję, że to komuś pomoże.
źródło
Mam problem z otwarciem pliku CSV w języku chińskim uproszczonym pobranym z banku online, próbowałem
latin1
, próbowałemiso-8859-1
, próbowałemcp1252
, wszystko bezskutecznie.Ale
pd.read_csv("",encoding ='gbk')
po prostu działa.źródło
Używam notesu Jupyter. W moim przypadku plik był wyświetlany w niewłaściwym formacie. Opcja „kodowania” nie działała. Zapisuję więc csv w formacie utf-8 i działa.
źródło
Spróbuj tego:
Wygląda na to, że zajmie się kodowaniem bez wyraźnego wyrażania go za pomocą argumentu
źródło
Sprawdź kodowanie, zanim przejdziesz do pand. Spowolni cię, ale ...
W python 3.7
źródło
Innym ważnym problemem, z którym się spotkałem i który spowodował ten sam błąd, było:
źródło
read_excel
pandy.Możesz tego spróbować.
źródło