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
Perché non basta saltare l'intestazione? –
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. –
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 –