#!/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
。
您可以建议其他改进吗?
答案 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)
。 - 编辑内部继续休息,因为这似乎是理想的行为。