如何跳过.csv文件中的行,在Python中迭代时会导致ValueError

时间:2014-06-08 21:59:47

标签: python csv

在我的程序中,我遍历.csv文件的行并对每个文件执行操作。在某些情况下,程序由ValueError终止。当发生这种情况时,我想打印一条错误消息,然后转到下一行,而不是让程序停止。这是迭代文件的代码:

with open(filename, 'rb') as f:
    reader = csv.reader(f, dialect=csv.excel_tab)
for row in reader:
        strrow = str(row)
        getInfo(strrow)

3 个答案:

答案 0 :(得分:1)

你想要的是使用try-catch块。它基本上是在try-block中执行代码,当发生异常时(并且存在匹配的catch-block),它会执行块。

with open(filename, 'rb') as f:
    reader = csv.reader(f, dialect=csv.excel_tab)
    try:
        for row in reader:
            strrow = str(row)
            getInfo(strrow)
    except ValueError:
        print "Oops!  That was no valid row..."

来源: Python Doc

答案 1 :(得分:0)

我认为这是try-except块的典型用例:

with open(filename, 'rb') as f:
    reader = csv.reader(f, dialect=csv.excel_tab)
    for row in reader:
        try:
            strrow = str(row)
            getInfo(strrow)
        except ValueError:
            print('Error!')

答案 2 :(得分:0)

其他答案是正确的,可以将try: except:标识为此处使用的代码,但是已经错误地应用了它。为了避免捕获您实际需要了解的错误(在这种情况下,让您实际上继续迭代reader),只有您明确要处理其错误的行需要包含在{{ 1}}。由于没有太多不能成为字符串,我猜这意味着:

try

然而,这确实提出了一些问题:

  1. 为什么不将实际列表传递给with open(filename, 'rb') as f: reader = csv.reader(f, dialect=csv.excel_tab) for row in reader: strrow = str(row) try: getInfo(strrow) except ValueError: print("Couldn't process line: {0}".format(strrow)) ?使用getInfo将文件从字符串解析为列表似乎毫无意义,然后将列表转换回字符串,当您实际可以传递列表时(并且可能保存一些解析)。
  2. 为什么不将错误处理放在csv内?在该函数中,您确切地知道该行的哪一部分出了什么问题(因此可以向用户提供更有用的消息);在外面,你所知道的是某些东西出错了。
  3. 如果您进行了这两项更改,则此处的代码会更简单:

    getInfo