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