2015-07-06 4 views
10

Я хочу прочитать список CSV-файлов в фреймворке данных. Однако у меня возникают проблемы с поиском ошибки, которая возникает, когда в файле есть строки заголовков, которые не соответствуют самим данным (т. Е. Метаданные или дополнительные пустые строки). Эта ошибка является «CParserError» (см. Мои сообщения об ошибках внизу).Как поймать `CParserError` при чтении CSV-файла

Мое текущее решение заключается в использовании примерочных, кроме заявления, с

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

Однако это не удается с ниже ошибки:

NameError: name 'CParserError' is not defined 

Мой код находится ниже. Как вы можете видеть, я думаю, что мне нужно несколько исключений, чтобы улавливать различные ошибки. Первый должен проверить, работают ли типы кодировки по умолчанию (файлы никогда не будут чем-то иным, чем utf-8 или latin-1). Если есть строки заголовка, pd.read_csv дает сообщение «CParserError» (см. Ниже), которое мне нужно поймать. Тогда, если есть какие-то другие разные проблемы, я тоже хочу их поймать.

Любые решения приветствуются, что в идеале объясняет, почему CParserError является неправильным, или если логика try-except может быть изменена, чтобы избежать зависимости от этого.

Спасибо.

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') 

Сообщение об ошибке при попытке разобрать CSV-файл с заголовками:

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

Почему просто не пропустить заголовок? –

+0

Не могли бы вы объяснить, что вы подразумеваете под этим? Я не уверен, что это будет непростая задача, учитывая, что иногда заголовки находятся в разных форматах. например иногда это будет 12 строк и 2 столбца строк заголовка; в других случаях это будет всего лишь одна строка. –

+1

Что вы подразумеваете под * 12 строк и 2 столбца строк заголовка *? Вы также можете «error_bad_lines = False», но это игнорирует все плохие строки –

ответ

6

Я ненавижу констатировать очевидное, но ...

from pandas.parser import CParserError 

FutureWarning: Модуль pandas.parser устарел и будет удален в будущей версии. Пожалуйста, используйте следующую вместо

import from the pandas.io.parser 
0

Я использую from pandas.parser import CParserError И я получил FutureWarning: The pandas.parser module is deprecated and will be removed in a future version. Please import from the pandas.io.parser instead Так from pandas.io.parser import CParserError рекомендуется.

Я использую Python 3.6, и моя панд версия 0.20.3


Но, когда я использую from pandas.io.parser import CParserError я получил ModuleNotFoundError: No module named 'pandas.io.parser'

Смежные вопросы