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"