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

-1 投票
2 回答
893 浏览
提问于 2025-04-18 04:10
#!/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

这其实是关于你循环的层级问题。你用的 '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)

. --把里面的 continue 改成 break,因为那样更符合你的需求。

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)

撰写回答