Python - 如何让循环在 Try Catch 之后继续?

Python - how to make loop continue after 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"

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"

手动迭代,希望csvreader对象能从异常中恢复:

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

csv.reader 对象到达文件末尾时引发 StopIteration 异常。此时使用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 作为奖励)