Python - как сделать цикл продолжить после Try Catch?

У меня есть следующий код Python, и он работает нормально, но он приносит ошибку, а затем переходит на последнюю строку.
Затем я удаляю проблемную строку из файла, снова запускаю скрипт Python, но он снова находит проблемную строку и переходит к концу.
Я хочу иметь возможность печатать все строки без перехода к концу сценария Python (просто пропустите строку и переходите к следующему):

import csv
with open('data.tsv', "rb") as f:
    reader = csv.reader( f )

    try:
        for row in reader:
            continue
    except csv.Error, e:
        print reader.line_num, e
        pass
print "End of file!\n"

2 ответа

Решение

Выполните итерацию вручную, надеясь, что объект чтения csv сможет восстановиться из исключения:

import csv
with open('data.tsv', "r") as f:
    reader = csv.reader( f )

    while True:
        try:
           row = next(reader)
           print(row)
        except csv.Error as e:
           print("line: {}, error: {}".format(reader.line_num, e))
        except StopIteration:
            break
    print("End of file!\n")

StopIteration исключение возникает, когда csv.reader объект достигает конца файла. С этой точки зрения, break используется для выхода из бесконечного цикла.

Давайте проверим это, вставив в строку NULL-байт. Простой способ - заменить f по списку строк:

data = """hello,world
foo,bar
hi\x00,I'm joe
recovered,yeah
"""

f = data.splitlines()

сейчас f можно кормить csv.reader с кодом выше (удалить with блок). Обратите внимание на байт NUL, вставленный в третью строку. Выход:

['hello', 'world']
['foo', 'bar']
line: 3, error: line contains NULL byte
['recovered', 'yeah']
End of file!

да уж! это работает (и код совместим с Python 2 и Python 3 в качестве бонуса)

Переместить try внутри для цикла

import csv
with open('data.tsv', "rb") as f:
    reader = csv.reader( f )
for row in reader:
    try:
            continue
    except csv.Error, e:
        print reader.line_num, e
        pass
print "End of file!\n"
Другие вопросы по тегам