Как продолжить цикл после отлова исключения в try ... кроме - PullRequest
0 голосов
/ 17 сентября 2018

Я читаю большой файл по частям и выполняю некоторые операции с каждым из них. При чтении одного из них у меня было следующее сообщение об ошибке:

pandas.errors.ParserError: Ошибка токенизации данных. Ошибка С: ожидается 26 полей в строке 15929977, пила 118

, что означает, что одна из моих строк файла не соответствует тому же формату, что и другие. То, что я думал, что мог сделать, было просто опустить этот кусок, но я не мог найти способ сделать это Я попытался сделать блок try/except следующим образом:

data = pd.read_table('ny_data_file.txt', sep=',', 
                      header=0, encoding = 'latin1', chunksize = 5000)
try: 
    for chunk in data:
           # operations
except pandas.errors.ParseError:
           # Here is my problem

То, что я написал здесь, состоит в том, что моя проблема заключается в том, что если фрагмент не анализируется должным образом, мой код автоматически перейдет к исключению, даже не входящему в цикл for , но я хотел бы пропустить этот кусок и перейти к следующему, на котором я хотел бы выполнить операции внутри цикла.

Я проверил stackoverflow, но не смог найти ничего похожего в том, где была выполнена попытка в цикле for. Любая помощь будет оценена.

UPDATE:

Я пытался сделать так, как предложено в комментариях:

try:
    for chunk in data:
        #operations
except pandas.errors.ParserError:
        # continue/pass/handle error

Но по-прежнему не создается исключение, потому что, как уже говорилось, исключение создается при извлечении chyunk из моих данных, а не при выполнении операций с ним.

Ответы [ 4 ]

0 голосов
/ 18 сентября 2018

Как подсказал @JonClements, моя проблема заключалась в том, чтобы использовать error_bad_lines=False в pd.read_csv, поэтому он просто пропустил строки, вызывающие проблемы, и позволил мне выполнить оставшуюся часть цикла for.

0 голосов
/ 17 сентября 2018

То, как вы используете try - except, заставляет пропустить весь цикл for, если в нем зафиксировано исключение.Если вы хотите пропустить только одну итерацию, вам нужно написать try-кроме внутри цикла, например:

for chunk in data:
    try:
       # operations
    except pandas.errors.ParseError as e:
        # inform the user of the error
        print("Error encountered while parsing chunk {}".format(chunk))
        print(e)
0 голосов
/ 17 сентября 2018

Я не уверен, где выброшено исключение. Может быть, добавление полного стека ошибок поможет. Если ошибка вызвана вызовом read_table (), возможно, вы можете попробовать это:

try: 
    data = pd.read_table('ny_data_file.txt', sep=',', 
                      header=0, encoding = 'latin1', chunksize = 5000)

except pandas.errors.ParseError:
           pass
for chunk in data:
           # operations
0 голосов
/ 17 сентября 2018

Я понял, что в части операций вы получаете исключение.Если это так: вы должны просто продолжить:

for chunk in data:
    try:
       # operations
    except pandas.errors.ParseError:
       # continue
...