2013-08-21 13 views
14

Myślę, że źle rozumiem intencję read_csv. Jeśli mam pliku „j” jakpandas.read_csv: jak pominąć linie komentarza

# notes 
a,b,c 
# more notes 
1,2,3 

Jak mogę pandas.read_csv ten plik, omijając żadnego „#” skomentował linie? Widzę w "komentarzu" pomocy, że linie nie są obsługiwane, ale wskazuje, że należy zwrócić pustą linię. Komunikat o błędzie CParserError: Błąd tokenizowania danych. C błąd: Oczekiwany 1 pola w wierszu 2, widziałem 3

Jestem obecnie na

In [15]: pandas.__version__ 
Out[15]: '0.12.0rc1' 

Na version'0.12.0-199-g4c8ad82' :

In [43]: df = pandas.read_csv('j', comment='#', header=None) 

CParserError: błąd tokenizacja danych. C błąd: Oczekiwany 1 pola w wierszu 2, widziałem 3

+0

Co jest ' 'j''? Nie mogę odtworzyć błędu podczas zamiany ścieżki '' '' j na ścieżkę pliku CSV. – Bryan

+2

Wypróbowałem 'df = pandas.read_csv ('j', comment = '#')' – TheoretiCAL

+0

Niestety, b # było literówką. "j" jest przykładowym plikiem. To błąd, o którym wspomina Andy Hayden. – mathtick

Odpowiedz

8

Jeden obejście jest określenie skiprows zignorować kilka pierwszych wpisów:

In [11]: s = '# notes\na,b,c\n# more notes\n1,2,3' 

In [12]: pd.read_csv(StringIO(s), sep=',', comment='#', skiprows=1) 
Out[12]: 
    a b c 
0 NaN NaN NaN 
1 1 2 3 

Inaczej read_csv robi się trochę zdezorientowany:

In [13]: pd.read_csv(StringIO(s), sep=',', comment='#') 
Out[13]: 
     Unnamed: 0 
a b   c 
NaN NaN  NaN 
1 2   3 

Wygląda na to, że w wersji 0.12.0 zarchiwizowałem a bug report.

Jako Wiktor wskazuje, można użyć dropna usunąć NaN po fakcie ... (jest recent open issue aby pisali wiersze są całkowicie ignorowane):

In [14]: pd.read_csv(StringIO(s2), comment='#', sep=',').dropna(how='all') 
Out[14]: 
    a b c 
1 1 2 3 

Uwaga: indeks domyślnego "zdradzi" fakt, że brakowało danych.

+1

A także dlatego, że nie chcesz, aby linie komentarza po prostu wywoływały '.dropna (jak = 'all'). Reset_index (drop = True)' after. –

2

Jestem na wersji Pand w wersji 0.13.1 i tej comments-in-csv problem wciąż mi przeszkadza.

Oto mój obecny obejście:

def read_csv(filename, comment='#', sep=','): 
    lines = "".join([line for line in open(filename) 
        if not line.startswith(comment)]) 
    return pd.read_csv(StringIO(lines), sep=sep) 

inaczej z pd.read_csv(filename, comment='#') uzyskać

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