Python - как сделать цикл продолжить после Try Catch? - PullRequest
0 голосов
/ 25 января 2019

У меня следующий код на 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 ]

0 голосов
/ 25 января 2019

выполнить итерацию вручную, надеясь, что объект чтения 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 в качестве бонуса)

0 голосов
/ 25 января 2019

Перемещение try внутри цикла for

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"
...