2015-07-06 8 views
10

Voglio leggere un elenco di CSV in un dataframe. Tuttavia, ho difficoltà ad individuare un errore che si verifica quando il file presenta righe di intestazione che non corrispondono ai dati stessi (ad esempio metadati o righe vuote aggiuntive). Questo errore è un 'Errore CParser' (vedi i miei messaggi di errore in fondo).Come catturare `CParserError` quando si legge un file CSV

mia soluzione attuale è quella di utilizzare un try-except, con

try: 
    #read file 
except CParserError: 
    #give me an error message 

Tuttavia, questo non riesce con il seguente errore:

NameError: name 'CParserError' is not defined 

Il mio codice è sotto. Come puoi vedere, penso di aver bisogno di più istruzioni tranne per cogliere i vari errori. Il primo dovrebbe verificare che i tipi di codifica predefiniti funzionino (i file non saranno mai nient'altro che utf-8 o latin-1). Se ci sono righe di intestazione, pd.read_csv fornisce un messaggio 'CParserError' (vedi sotto) che devo catturare. Quindi, se ci sono altri problemi vari, voglio catturare anche quelli.

Eventuali soluzioni benvenuti, che idealmente dovrebbe spiegare perché CParserError non è giusto, o se il try-tranne logica potrebbero essere modificate per evitare la dipendenza da questo.

Grazie.

files_list = glob.glob('*.csv*')  #get all csvs 
files_dict = {}   
for file in files_list: 
    try: 
     files_dict[file] = pd.read_csv('DFA_me_week27.csv', encoding='utf-8').read() 
    except UnicodeDecodeError:  
     files_dict[file] = pd.read_csv('DFA_me_week27.csv', encoding='Latin-1').read() 
    except CParserError: 
     print(file, 'failed: check for header rows') 
    except: 
     print(file, 'failed: some other error occurred') 

Il messaggio di errore quando si cerca di analizzare un file CSV con le intestazioni:

CParserError        Traceback (most recent call last) 
<ipython-input-15-e454c053d675> in <module>() 
----> 1 pd.read_csv('DFA_me_week27.csv') 

C:\Users\john.lwli\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\io\parsers.py in parser_f(filepath_or_buffer, sep, dialect, compression, doublequote, escapechar, quotechar, quoting, skipinitialspace, lineterminator, header, index_col, names, prefix, skiprows, skipfooter, skip_footer, na_values, na_fvalues, true_values, false_values, delimiter, converters, dtype, usecols, engine, delim_whitespace, as_recarray, na_filter, compact_ints, use_unsigned, low_memory, buffer_lines, warn_bad_lines, error_bad_lines, keep_default_na, thousands, comment, decimal, parse_dates, keep_date_col, dayfirst, date_parser, memory_map, float_precision, nrows, iterator, chunksize, verbose, encoding, squeeze, mangle_dupe_cols, tupleize_cols, infer_datetime_format, skip_blank_lines) 
    463      skip_blank_lines=skip_blank_lines) 
    464 
--> 465   return _read(filepath_or_buffer, kwds) 
    466 
    467  parser_f.__name__ = name 

C:\Users\john.lwli\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\io\parsers.py in _read(filepath_or_buffer, kwds) 
    249   return parser 
    250 
--> 251  return parser.read() 
    252 
    253 _parser_defaults = { 

C:\Users\john.lwli\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\io\parsers.py in read(self, nrows) 
    708     raise ValueError('skip_footer not supported for iteration') 
    709 
--> 710   ret = self._engine.read(nrows) 
    711 
    712   if self.options.get('as_recarray'): 

C:\Users\john.lwli\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\io\parsers.py in read(self, nrows) 
    1157 
    1158   try: 
-> 1159    data = self._reader.read(nrows) 
    1160   except StopIteration: 
    1161    if nrows is None: 

pandas\parser.pyx in pandas.parser.TextReader.read (pandas\parser.c:7403)() 

pandas\parser.pyx in pandas.parser.TextReader._read_low_memory (pandas\parser.c:7643)() 

pandas\parser.pyx in pandas.parser.TextReader._read_rows (pandas\parser.c:8260)() 

pandas\parser.pyx in pandas.parser.TextReader._tokenize_rows (pandas\parser.c:8134)() 

pandas\parser.pyx in pandas.parser.raise_parser_error (pandas\parser.c:20720)() 

CParserError: Error tokenizing data. C error: Expected 2 fields in line 12, saw 12 
+0

Perché non basta saltare l'intestazione? –

+0

Puoi spiegare cosa intendi con questo? Non sono sicuro che sarebbe un compito facile, dato che a volte le intestazioni sono in formati diversi. per esempio. a volte saranno 12 righe e 2 colonne di righe di intestazione; altre volte sarà solo una riga. –

+1

Cosa intendi per * 12 righe e 2 colonne di righe di intestazione *? Potresti anche "error_bad_lines = False", ma questo ignorerebbe tutte le righe errate –

risposta

6

Odio affermare l'ovvio, ma ...

from pandas.parser import CParserError 

FutureWarning: Il modulo pandas.parser è deprecato e verrà rimosso in una versione futura. Si prega di utilizzare il seguente invece

import from the pandas.io.parser 
0

Io uso from pandas.parser import CParserError e ho avuto FutureWarning: The pandas.parser module is deprecated and will be removed in a future version. Please import from the pandas.io.parser instead Quindi si consiglia from pandas.io.parser import CParserError .

sto usando Python 3.6, e la mia versione panda è 0.20.3


Tuttavia, quando uso from pandas.io.parser import CParserError ho ottenuto ModuleNotFoundError: No module named 'pandas.io.parser'

Problemi correlati