在Python中验证CSV文件的布尔值

时间:2014-04-25 03:48:13

标签: python csv

#!/usr/bin/python3
import csv
with open('foo.csv') as f:
    reader = csv.reader(f)
    for row in reader:
        for i, v in enumerate(row):
            if not v in ['0','1']:
                print ("Skipping", row)
                print (i, "not a 0 or 1")
                continue
        print ("Good", row)

输入:

x220:~/csv$ cat foo.csv
0,1,0
1,2,3

我编写了一个简单的Python程序来检查CSV输入是否具有良好的0或1值。第一行有效,但不是foo.csv的第二行,因为它具有无效的“2”和“3”值。

第一个问题是 continue 在这里不起作用。我不知道如何解决这个问题。我可以设置一个无效的布尔值并在验证阶段结束时使用if invalid: continue,但这对我来说看起来很糟糕,特别是如果我的其余验证代码使用continue

您可以建议其他改进吗?

2 个答案:

答案 0 :(得分:1)

看起来你需要“继续”你的外循环,即类似以下情况之一......

所以这样的事情应该有效:

#!/usr/bin/python3
import csv
with open('foo.csv') as f:
    reader = csv.reader(f)
    for row in reader:
        for i, v in enumerate(row):
            if not v in ['0','1']:
                print ("Skipping", row)
                print (i, "not a 0 or 1")
                break
        else:
            print ("Good", row)

如果您不需要记录跳过的行,则可以采用更短的方式:

#!/usr/bin/python3
import csv
with open('foo.csv') as f:
    reader = csv.reader(f)
    rows = (row for row in reader
            if all(v in ['0', '1'] for v in row))

    for row in rows:
        print ("Good", row)

答案 1 :(得分:0)

这只是你的for循环的级别。你的'continue'打印语句说你正在跳过一行,但你的continue语句只会跳过最内层的循环,这是在元素级别。您将始终到达打印良好的行行。

尝试使用布尔变量来记录行是否保持良好状态:

for row in reader:
    rowIsGood=true    
    for i, v in enumerate(row):
        if not v in ['0','1']:
            print ("Skipping", row)
            print (i, "not a 0 or 1")
            rowIsGood=false
            break
    if rowIsGood:
        print ("Good", row)

。 - 编辑内部继续休息,因为这似乎是理想的行为。