2013-04-05 10 views
5

Próbuję odczytywać segmenty pliku CSV do pandy DataFrame, i wpadam w kłopoty, kiedy ustawiam nrows na więcej niż jeden punkt. Mój plik CSV jest podzielony na różne segmenty z różnymi nagłówkami/typami danych, więc przeszedłem przez ten plik i znalazłem numery linii różnych segmentów oraz zapisałem numery linii. Kiedy próbuję zrobić:Czytanie części ~ 13000 wiersza pliku CSV z pandami read_csv i Nrows

pd.io.parsers.read_csv('filename',skiprows=40, nrows=12646) 

Działa dobrze. Jakiekolwiek dalsze rzędy, i zgłasza błąd:

CParserError: Error tokenizing data. C error: Expected 56 fields in line 13897, saw 71 

To prawda, że ​​linia 13897 ma, że ​​wiele wierszy, dlatego staram się używać nRows i skiprows. Mogę znaleźć ostatni rząd, który pandy przeczytają i nie będzie wyglądać inaczej niż reszta. Patrząc na plik w edytorze szesnastkowym wciąż nie widzę żadnej różnicy.

Ja również próbowałem go innym pliku CSV i uzyskać podobne wyniki:

pd.io.parsers.read_csv('file2',skiprows=112, nrows=18524) 

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 18188 entries, 0 to 18187 

Ale:

pd.io.parsers.read_csv('file2',skiprows=112, nrows=18525) 

otrzymujemy:

CParserError: Error tokenizing data. C error: Expected 56 fields in line 19190, saw 71 

Czy jest coś "brakuje? Czy jest inny sposób na zrobienie tego?

Używam: pandas-0.10.1.win-amd64-py3.3, numpy-MKL-1.7.1rc1.win-amd64-py3.3 i python-3.3.0.amd64 w systemie Windows. Mam ten sam problem z numpy-unoptimized-1.7.1rc1.win-amd64-py3.3.

+0

jest coś podejrzanego z tej linii z nią tak jak to ma 70 przecinki gdzie każda poprzednia linia ma 55 ...? –

+0

Linia, do której odnosi się błąd, to jedna z 70 przecinkami, tak. Ale z skiprowami i nrowami staram się uniemożliwić mu dotarcie do tej linii. Na przykład, gdy błąd odnosi się do linii 13897, próbuję odczytać z linii od 40 do 12647 + 40. Wiersze, które próbuję określić, są normalne (55 pól). – dooz

Odpowiedz

3

Można użyć warn_bad_lines i error_bad_lines wyłączyć złe korekty błędu & ostrzeżenie:

import pandas as pd 
from StringIO import StringIO 
data = StringIO("""a,b,c 
1,2,3 
4,5,6 
6,7,8,9 
1,2,5 
3,4,5""") 
pd.read_csv(data, warn_bad_lines=False, error_bad_lines=False) 
+0

To wydaje się działać, ale nadal zastanawiam się, dlaczego to błąd. W międzyczasie napisałem rozwiązanie zastępujące bufory StringIO, ale tak jak powiedziałem, zastanawiam się, dlaczego daje mi błąd w linii, której nie polecono przeczytać. pd.read_csv odczytuje (same) dane fine (bez flag bad_lines) z StringIO składającego się z linii pliku, który próbuję powiedzieć, żeby czytał z nrow i skiprows. – dooz

Powiązane problemy