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

4
我有以下的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个回答

6
手动迭代,希望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()

现在可以使用上面的代码(删除 with 块)将 f 提供给 csv.reader。请注意第三行插入的 NUL 字节。输出结果:

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

太好了!它可以运行(并且作为额外的奖励,代码与Python 2和Python 3兼容)


“希望CSV读取器对象能够从异常中恢复”是一个有趣的观点。这里可能会出现一个异常,导致读取器无法继续工作吗?这是指语法或其他问题会影响到下一行吗? - roganjosh
我想,如果数据足够损坏,你可能会失去读者的兴趣,然后就会不断出现异常。 - Jean-François Fabre
好的,我明白了。它不会破坏对象,只是一个问题,导致每个后续行都出错。不知何故,当我读到那一行时,我脑海中想象了更复杂的东西 :P - roganjosh
当一行包含空字节时,这非常有用。 - Jean-François Fabre

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

1
很遗憾,你的“尝试”永远不会失败……for row in reader抛出了异常。 - AChampion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接