Próbuję użyć pand do manipulowania plikiem .csv, ale otrzymuję ten błąd:
pandas.parser.CParserError: Błąd tokenizacji danych. Błąd C: Oczekiwano 2 pól w linii 3, patrz 12
Próbowałem czytać dokumenty pand, ale nic nie znalazłem.
Mój kod jest prosty:
path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)
Jak mogę to rozwiązać? Czy powinienem użyć csv
modułu lub innego języka?
Plik pochodzi od Morningstar
pandas.to_csv()
, MUSI to być spowodowane tym, że w nazwach kolumn znajduje się „\ r”, w którym to przypadku to_csv () faktycznie zapisze nazwy kolejnych kolumn w pierwszej kolumnie ramki danych, powodując różnica między liczbą kolumn w pierwszych X wierszach. Ta różnica jest jedną z przyczyn błędu C.pd.read_csv("<path>", sep=";")
. Spróbuj . Nie używaj programu Excel do sprawdzania, ponieważ czasami domyślnie umieszcza dane w kolumnach, a zatem usuwa separator.Odpowiedzi:
możesz także spróbować;
Pamiętaj, że spowoduje to pominięcie linii naruszających.
źródło
expected 8 fields, saw 9
?read_csv
. @PetraBarus, dlaczego po prostu nie dodać kolumn do plików CSV, w których ich brakuje (z wartościami null w razie potrzeby)?names=["col1", "col2", ...]
maksymalnej liczby oczekiwanych kolumn również działa i w ten sposób rozwiązałem ten problem, gdy go spotkałem. Zobacz: stackoverflow.com/questions/18039057/...Może to być problem z
Aby go rozwiązać, spróbuj podać argumenty
sep
i / lubheader
argumenty podczas wywoływaniaread_csv
. Na przykład,W powyższym kodzie
sep
definiuje ogranicznik iheader=None
mówi pandom, że dane źródłowe nie mają wiersza dla nagłówków / tytułów kolumn. Tak mówi dokument : „Jeśli plik nie zawiera wiersza nagłówka, należy jawnie przekazać nagłówek = Brak”. W tym przypadku pandy automatycznie tworzą wskaźniki liczb całkowitych dla każdego pola {0,1,2, ...}.Według doktryn, separator nie powinien stanowić problemu. Dokumenty mówią, że „jeśli sep to None [nie określono], spróbuje to automatycznie ustalić”. Jednak nie miałem z tym szczęścia, w tym przypadków z oczywistymi ogranicznikami.
źródło
Parser jest mylony przez nagłówek pliku. Odczytuje pierwszy wiersz i podaje liczbę kolumn z tego wiersza. Ale dwa pierwsze wiersze nie reprezentują rzeczywistych danych w pliku.
Wypróbuj z
data = pd.read_csv(path, skiprows=2)
źródło
Twój plik CSV może mieć zmienną liczbę kolumn i
read_csv
wywnioskować liczbę kolumn z kilku pierwszych wierszy. Dwa sposoby rozwiązania tego problemu w tym przypadku:1) Zmień plik CSV, tak aby zawierał fikcyjny pierwszy wiersz z maksymalną liczbą kolumn (i określ
header=[0]
)2) Lub użyj
names = list(range(0,N))
gdzie N jest maksymalną liczbą kolumn.źródło
Jest to z pewnością kwestia ogranicznika, ponieważ większość plików CSV CSV jest utworzonych przy użyciu,
sep='/t'
więc spróbujread_csv
użyć znaku tabulacji(\t)
za pomocą separatora/t
. więc spróbuj otworzyć, używając następującej linii kodu.źródło
Miałem również ten problem, ale może z innego powodu. W CSV miałem kilka przecinków końcowych, które dodawały dodatkową kolumnę, którą pandy próbowały odczytać. Korzystanie z poniższych działa, ale po prostu ignoruje złe linie:
Jeśli chcesz, aby linie były brzydkim hackem do obsługi błędów, wykonaj następujące czynności:
Zacząłem pisać skrypt, aby ponownie wstawić linie do DataFrame, ponieważ złe linie zostaną podane przez zmienną „line” w powyższym kodzie. Można tego wszystkiego uniknąć, po prostu używając czytnika csv. Mamy nadzieję, że twórcy pand ułatwią radzenie sobie z tą sytuacją w przyszłości.
źródło
Miałem ten problem, gdy próbowałem czytać w CSV bez podawania nazw kolumn.
Wcześniej określiłem nazwy kolumn na liście, a następnie przekazałem je
names
i rozwiązało to natychmiast. Jeśli nie masz ustawionych nazw kolumn, możesz po prostu utworzyć tyle nazw symboli zastępczych, ile maksymalna liczba kolumn może znajdować się w danych.źródło
Sam miałem ten problem kilka razy. Niemal za każdym razem powodem jest to, że plik, który próbowałem otworzyć, nie był poprawnie zapisanym plikiem CSV. Przez „prawidłowo” rozumiem, że każdy wiersz miał taką samą liczbę separatorów lub kolumn.
Zwykle dzieje się tak, ponieważ otworzyłem plik CSV w programie Excel, a następnie zapisałem go nieprawidłowo. Mimo że rozszerzenie pliku nadal było w formacie .csv, czysty format CSV został zmieniony.
Każdy plik zapisany z pandami to_csv zostanie poprawnie sformatowany i nie powinien mieć tego problemu. Ale jeśli otworzysz go za pomocą innego programu, może to zmienić strukturę.
Mam nadzieję, że to pomaga.
źródło
Natknąłem się na ten sam problem.
pd.read_table()
Wydawało się, że używanie tego samego pliku źródłowego działa. Nie mogłem wyśledzić przyczyny tego, ale było to przydatne obejście w mojej sprawie. Być może ktoś bardziej kompetentny może rzucić więcej światła na to, dlaczego to zadziałało.Edycja: Odkryłem, że ten błąd pojawia się, gdy w pliku jest tekst, który nie ma tego samego formatu co rzeczywiste dane. Zazwyczaj są to informacje nagłówka lub stopki (więcej niż jeden wiersz, więc skip_header nie działa), które nie będą oddzielone taką samą liczbą przecinków, jak rzeczywiste dane (przy użyciu read_csv). Korzystanie z read_table wykorzystuje tabulator jako ogranicznik, który może ominąć bieżący błąd użytkowników, ale wprowadzić inne.
Zwykle omijam ten problem, czytając dodatkowe dane do pliku, a następnie używam metody read_csv ().
Dokładne rozwiązanie może się różnić w zależności od twojego rzeczywistego pliku, ale to podejście zadziałało dla mnie w kilku przypadkach
źródło
Poniższe działało dla mnie (opublikowałem tę odpowiedź, ponieważ miałem konkretnie ten problem w Notatniku Google Colaboratory):
źródło
|
jako ogranicznika dla mojego pliku .csv. Wolę najpierw wypróbować to podejście, zamiast pomijania linii lub złych linii.Miałem podobny problem podczas próby odczytania tabeli rozdzielanej tabulatorami ze spacjami, przecinkami i cudzysłowami:
To mówi, że ma to coś wspólnego z silnikiem parsującym C (który jest domyślny). Może zmiana na python zmieni wszystko
To inny błąd.
Jeśli pójdziemy dalej i spróbujemy usunąć spacje z tabeli, błąd z silnika Python ponownie się zmieni:
I staje się jasne, że pandy miały problemy z analizą naszych wierszy. Aby przeanalizować tabelę za pomocą silnika Python, musiałem wcześniej usunąć wszystkie spacje i cytaty z tabeli. Tymczasem silnik C ciągle się zawieszał, nawet z przecinkami w rzędach.
Aby uniknąć tworzenia nowego pliku z zamiennikami, zrobiłem to, ponieważ moje tabele są małe:
tl; dr
Zmień silnik parsowania, staraj się unikać cudzysłowów / przecinków / spacji w danych.
źródło
Zestaw danych, którego użyłem, zawierał wiele cudzysłowów („) używanych poza formatowaniem. Byłem w stanie naprawić błąd, włączając ten parametr dla
read_csv()
:źródło
Użyj separatora w parametrze
Przeczytam.
źródło
Chociaż nie jest tak w przypadku tego pytania, błąd ten może również pojawić się w przypadku skompresowanych danych. Jawne ustawienie wartości dla
kwarg
compression
rozwiązania mojego problemu.źródło
Alternatywą, która okazała się przydatna w radzeniu sobie z podobnymi błędami analizy, jest użycie modułu CSV do przekierowania danych do pandy df. Na przykład:
Uważam, że moduł CSV jest nieco bardziej odporny na źle sformatowane pliki oddzielone przecinkami, dlatego odniosłem sukces dzięki tej ścieżce rozwiązania takich problemów.
źródło
działa następująca sekwencja poleceń (tracę pierwszy wiersz danych -no header = None present-, ale przynajmniej ładuje):
df = pd.read_csv(filename, usecols=range(0, 42)) df.columns = ['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14']
Następujące NIE działa:
df = pd.read_csv(filename, names=['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14'], usecols=range(0, 42))
CParserError: Błąd tokenizacji danych. Błąd C: Oczekiwano 53 pól w linii 1605634, piła 54 Następujące NIE działa:
df = pd.read_csv(filename, header=None)
CParserError: Błąd tokenizacji danych. Błąd C: Oczekiwano 53 pól w linii 1605634, piła 54
Dlatego w swoim problemie musisz przejść
usecols=range(0, 2)
źródło
Dla tych, którzy mają podobny problem z Python 3 w systemie Linux.
Próbować:
źródło
Czasami problemem nie jest użycie Pythona, ale surowe dane.
Mam ten komunikat o błędzie
Okazało się, że w opisie kolumny czasem znajdowały się przecinki. Oznacza to, że plik CSV musi zostać wyczyszczony lub należy użyć innego separatora.
źródło
posługiwać się
pandas.read_csv('CSVFILENAME',header=None,sep=', ')
podczas próby odczytu danych csv z linku
http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data
Skopiowałem dane z witryny do mojego pliku csv. Miał dodatkowe spacje, więc używał sep = ',' i działał :)
źródło
Miałem zestaw danych z wcześniej istniejącymi numerami wierszy, użyłem index_col:
źródło
Oto co zrobiłem.
sep='::'
rozwiązałem mój problem:źródło
Miałem podobny przypadek jak ten i ustawienie
pracował
źródło
Mam ten sam problem, gdy read_csv: ParserError: Błąd tokenizacji danych. Właśnie zapisałem stary plik csv w nowym pliku csv. Problem jest rozwiązany!
źródło
Problemem było to, że do mojego CSV dołączono nową kolumnę w ciągu dnia . Akceptowane rozwiązanie odpowiedzi nie działałoby, ponieważ każdy przyszły wiersz zostałby odrzucony, gdybym go użył
error_bad_lines=False
.Rozwiązaniem w tym przypadku było użycie parametru usecols w
pd.read_csv()
. W ten sposób mogę określić tylko kolumny, które muszę wczytać do pliku CSV, a mój kod Python pozostanie odporny na przyszłe zmiany CSV, o ile istnieje kolumna nagłówka (a nazwy kolumn nie zmieniają się).Przykład
Inną zaletą tego jest to, że mogę załadować znacznie mniej danych do pamięci, jeśli używam tylko 3-4 kolumn CSV, który ma 18-20 kolumn.
źródło
Prosta rozdzielczość : otwórz plik csv w programie Excel i zapisz go pod innym plikiem w formacie csv. Ponownie spróbuj zaimportować go pająk, Twój problem zostanie rozwiązany!
źródło
Napotkałem ten błąd ze zbłąkanym cudzysłowem. Używam oprogramowania do mapowania, które umieszcza cudzysłowy wokół elementów tekstowych podczas eksportowania plików rozdzielanych przecinkami. Tekst wykorzystujący znaki cudzysłowu (np. „= Stopy i” = cale) może być problematyczny, gdy wywoła kolizję ogranicznika. Rozważ ten przykład, w którym zauważono, że 5-calowy wydruk dziennika zagłębienia jest zły:
UWI_key,Latitude,Longitude,Remark US42051316890000,30.4386484,-96.4330734,"poor 5""
Używanie
5"
jako skrótu dla5 inch
kończy się rzuceniem klucza w pracach. Excel po prostu usunie dodatkowy znak cudzysłowu, ale Panda rozpadnie się bez powyższegoerror_bad_lines=False
argumentu.źródło
O ile wiem, po obejrzeniu pliku problem polega na tym, że plik csv, który próbujesz załadować, ma wiele tabel. Istnieją puste wiersze lub wiersze zawierające tytuły tabel. Spróbuj spojrzeć na tę odpowiedź Stackoverflow . Pokazuje, jak to osiągnąć programowo.
Innym dynamicznym podejściem do tego byłoby użycie modułu csv , odczytywanie każdego wiersza na raz i sprawdzanie poprawności / wyrażeń regularnych, aby wywnioskować, czy wiersz jest (tytuł / nagłówek / wartości / puste miejsce). Masz jeszcze jedną zaletę dzięki temu podejściu, że możesz dzielić / dołączać / zbierać dane w obiektach python zgodnie z potrzebami.
Najprościej byłoby użyć funkcji pandy
pd.read_clipboard()
po ręcznym wybraniu i skopiowaniu tabeli do schowka, na wypadek gdybyś mógł otworzyć plik CSV w programie Excel lub coś takiego.Nieistotne :
Ponadto nie ma znaczenia dla twojego problemu, ale ponieważ nikt o tym nie wspomniał : miałem ten sam problem podczas ładowania niektórych zestawów danych, takich jak
seeds_dataset.txt
z UCI. W moim przypadku błąd występował, ponieważ niektóre separatory miały więcej białych znaków niż prawdziwa karta\t
. Zobacz na przykład wiersz 3 poniżejDlatego należy użyć
\t+
wzorca separatora zamiast\t
.źródło
W moim przypadku dzieje się tak, ponieważ format pierwszych i ostatnich dwóch wierszy pliku csv różni się od środkowej zawartości pliku.
Więc to, co robię, to otwieram plik csv jako ciąg, analizuję zawartość ciągu, a następnie używam,
read_csv
aby uzyskać ramkę danych.źródło
W moim przypadku separator nie był domyślnym „”, ale Tab.
Uwaga: „\ t” nie działało, jak sugerują niektóre źródła. „\\ t” było wymagane.
źródło
Miałem podobny błąd, a problem polegał na tym, że w pliku csv miałem cudzysłowy i potrzebowałem odpowiednio ustawić parametr escapechar.
źródło