【问题标题】:Python - how to make loop continue after Try Catch?Python - Try Catch 后如何使循环继续?
【发布时间】:2019-06-19 16:05:53
【问题描述】:

我有以下 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"

【问题讨论】:

    标签: python next skip continue


    【解决方案1】:

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

    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 兼容作为奖励)

    【讨论】:

    • “希望 csv 读取器对象可以从异常中恢复”是一个有趣的点。有可能在这里得到一个例外,只是给一个死去的读者?这是因为语法或导致问题的其他原因只是级联到下一行?
    • 我想你可能会失去足够损坏数据的阅读器:)然后你会在异常之后得到异常。
    • 好的,我跟着。它不会破坏对象,只是一个在后续每一行都不断出错的问题。出于某种原因,当我读到那一行时,我的脑海里有了更详细的东西:P
    • 它很有用,例如当一行包含一个空字节时。
    【解决方案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"
    

    【讨论】:

    • 不幸的是,您的try 永远不会失败...for row in reader 正在抛出异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多