Как получить имя файла CSV, вызывающего ошибку в dask.read_csv? - PullRequest
2 голосов
/ 20 марта 2019

Моя цель - распараллелить чтение многих (500+) CSV-файлов, содержащих данные измерений.Для этого я передаю список путей (исходные_файлы) синхронному клиенту.Кроме того, я указал dtypes и имена столбцов (order_list).

df = dd.read_csv(source_files, 
                         names = order_list,
                         include_path_column = True,
                         delimiter = ';',
                         decimal = '.',
                         dtype = dtype,
                         na_values = '.',
                         assume_missing = True,
                         error_bad_lines = False
                         )

df = CLIENT.compute(df).result()

Для поврежденной строки я получаю следующее сообщение об ошибке:

File "pandas\_libs\parsers.pyx", line 1164, in pandas._libs.parsers.TextReader._convert_tokens

ValueError: cannot safely convert passed user dtype of bool for float64 dtyped data in column 116

В редких случаях регистратор данных портит записьфайлы журналов, в результате чего float будет там, где я ожидал логическое значение.Я уверен, что dtypes, которые я передаю read_csv, верны и могут быть удовлетворены в подавляющем большинстве csv-файлов.

Есть ли способ определить, какой csv-файл действительно вызвал ошибку?Также было бы неплохо узнать, какая строка данного csv-файла вызвала исключение.

Заранее спасибо!

1 Ответ

0 голосов
/ 20 марта 2019

Перехватите исключение:

Вместо

df = dd.read_csv(source_files, 
                         names = order_list,
                         include_path_column = True,
                         delimiter = ';',
                         decimal = '.',
                         dtype = dtype,
                         na_values = '.',
                         assume_missing = True,
                         error_bad_lines = False
                         )

df = CLIENT.compute(df).result()

Выполните итерацию всех из них и запишите исключение

for source_file in source_files:
    try:
        df = dd.read_csv(source_file, 
                             names = order_list,
                             include_path_column = True,
                             delimiter = ';',
                             decimal = '.',
                             dtype = dtype,
                             na_values = '.',
                             assume_missing = True,
                             error_bad_lines = False
                             ) df = dd.read_csv(source_files, 
                             names = order_list,
                             include_path_column = True,
                             delimiter = ';',
                             decimal = '.',
                             dtype = dtype,
                             na_values = '.',
                             assume_missing = True,
                             error_bad_lines = False
                             )
    except ValueError:
        raise Exception('Could not read {}'.format(source_file))

Это скажет вам, какой файл не удалось, и вымогу проверить почему.Если они не терпят неудачу, тогда просто присоединитесь к dfs, вы получаете на большой, и все готово.

...