Czytanie pliku rozdzielanego tabulatorami za pomocą Pandas - działa w systemie Windows, ale nie na Macu

91

Czytałem plik danych rozdzielany tabulatorami w systemie Windows z Pandas / Python bez żadnych problemów. Plik danych zawiera uwagi w pierwszych trzech wierszach, a następnie zawiera nagłówek.

df = pd.read_csv(myfile,sep='\t',skiprows=(0,1,2),header=(0))

Teraz próbuję odczytać ten plik na moim komputerze Mac. (Mój pierwszy raz używam Pythona na Macu.) Pojawia się następujący błąd.

pandas.parser.CParserError: Error tokenizing data. C error: Expected 1
fields in line 8, saw 39

Jeśli ustawisz argument error_bad_lines dla read_csv na Fałsz , otrzymam następujące informacje, które są kontynuowane do końca ostatniego wiersza.

Skipping line 8: expected 1 fields, saw 39
Skipping line 9: expected 1 fields, saw 125
Skipping line 10: expected 1 fields, saw 125
Skipping line 11: expected 1 fields, saw 125
Skipping line 12: expected 1 fields, saw 125
Skipping line 13: expected 1 fields, saw 125
Skipping line 14: expected 1 fields, saw 125
Skipping line 15: expected 1 fields, saw 125
Skipping line 16: expected 1 fields, saw 125
Skipping line 17: expected 1 fields, saw 125
...

Czy muszę określać wartość argumentu kodowania ? Wygląda na to, że nie powinienem tego robić, ponieważ czytanie pliku działa dobrze w systemie Windows.

user3062149
źródło
Czy używasz dokładnie tej samej wersji pand w obu systemach operacyjnych? Czy możesz podać przykładowe dane ilustrujące problem na komputerze Mac?
joris
niepowiązane: czy rozumiesz różnicę między: (0)i (0,)w Pythonie? Uwaga: (0)jest 0i (0,)jest 0,- przecinek tworzy krotkę (z wyjątkiem pustej), a nie nawiasy.
jfs
Czy próbowałeś df = pd.read_table(myfile, skiprows=[0,1,2], header=0)?
pbreach
Cześć wszystkim. Dzięki za sugestie. Stworzyłem tymczasowe rozwiązanie, ale być może trzeba będzie wrócić do tego problemu i poszukać lepszego rozwiązania w przyszłości. Jeśli i kiedy to zrobię, przeanalizuję Twoją sugestię. Moim tymczasowym rozwiązaniem było pobranie pliku csv, który miałem (i wcześniej przekonwertowałem go na problematyczny plik rozdzielany tabulatorami za pomocą programu Excel) i zapisanie go jako plik .tsv z dokumentami Google. Użyłem Gdocsa tylko dlatego, że był to najwygodniejszy dostępny dla mnie wówczas program do obsługi dokumentów. Ta konwersja zadziałała. Wydaje mi się, że Pandas był w stanie poprawnie odczytać plik i przejść do pozostałej części mojego kodu.
user3062149
Podejrzewam, że problem, który widzisz tutaj z twoim komputerem Mac, to terminatory linii. Arkusze wykonane na mac może powodować różnego rodzaju zachowań zabawy z różnych bibliotek, w tym lib csv_reader w python
brad Sanders

Odpowiedzi:

146

Największą wskazówką jest to, że wszystkie wiersze są zwracane w jednej linii. Oznacza to, że terminatory linii są ignorowane lub nie są obecne.

Możesz określić terminator linii dla csv_reader. Jeśli korzystasz z komputera Mac, utworzone linie kończą się \rraczej niż standardem Linuksa \nlub lepiej, nadal szelki i podejście paska okien z \r\n.

pandas.read_csv(filename, sep='\t', lineterminator='\r')

Możesz także otworzyć wszystkie swoje dane za pomocą pakietu kodeków. Może to zwiększyć niezawodność kosztem szybkości ładowania dokumentów.

import codecs

doc = codecs.open('document','rU','UTF-16') #open for reading with "universal" type set

df = pandas.read_csv(doc, sep='\t')
szlifierki brad
źródło
3
Dodanie kodeków do kodu pomogło mi. Potem zdałem sobie sprawę, że w read_csv jest parametr, który robi to samo. Dodałem encoding = 'utf-16' i rozwiązało to problem.
Michaił Venkov
4

Inną opcją byłoby dodanie engine='python'do poleceniapandas.read_csv(filename, sep='\t', engine='python')

user3479780
źródło