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.
(0)
i(0,)
w Pythonie? Uwaga:(0)
jest0
i(0,)
jest0,
- przecinek tworzy krotkę (z wyjątkiem pustej), a nie nawiasy.df = pd.read_table(myfile, skiprows=[0,1,2], header=0)
?Odpowiedzi:
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ę
\r
raczej niż standardem Linuksa\n
lub 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')
źródło
Inną opcją byłoby dodanie
engine='python'
do poleceniapandas.read_csv(filename, sep='\t', engine='python')
źródło