如何逐列验证CSV文件数据?

时间:2019-04-28 18:44:27

标签: python csv validation

我是python的新手,正在尝试读取一个csv文件并验证数据以确保所有数据都在特定范围内。每列都有不同的规格。

示例: 第0列中的所有数据必须在1到500之间 第1列中的所有数据必须在2.5到50.5之间

我可以毫无问题地读取csv,但是当我尝试验证某一列的数据时,似乎只有第一个条目正在被验证,程序只是为每行重新打印第一个条目的通过或失败。

csv文件示例:

1,2
100,2.5
1000,3.5
#looking for just greater than or equal to 1

import csv

with open("csvdata.csv", "r") as f:
    csvreader = csv.reader(f, delimiter= ",")
    for row in csvreader:
        if 1 <= row[0]:
            print "pass"
        else:
            print "fail"

#looking for greater than or equal to 1 and less than or equal to 500

import csv

with open("csvdata.csv", "r") as f:
    csvreader = csv.reader(f, delimiter= ",")
    for row in csvreader:
        if 1 <= row[0] <= 500:
            print "pass"
        else:
            print "fail"

我希望第一个代码片段产生:

pass
pass
pass

它确实可以,但是当我将其从if 1 < row[0]:更改为if 10000 < row[0]:时,仍然会给出所有通过消息。

我希望第二个片段产生:

pass
pass
fail

但是会产生:

fail
fail
fail

1 个答案:

答案 0 :(得分:2)

您的代码看起来几乎是正确的,但是您的验证消息并没有告诉您很多有用的信息,这就是为什么您不能准确地说出它是否有效的原因。

您需要解决的主要问题是.csv中的值是字符串,因此测试if 1 <= row[0] <= 500不能按您期望的那样工作,在Python 3中,它会给您一个有用的错误消息,而不是悄悄地执行意外。在进行比较之前,将数字转换为int

with open("csvdata.csv", "r") as f:
    csvreader = csv.reader(f, delimiter= ",")
    for row in csvreader:
        if 1 <= int(row[0]) <= 500:
            print "row {0} pass value is in range".format(csvreader.line_num)
        else:
            print "row {0} fail value is {1} out of range".format(csvreader.line_num, row[0])

作为一个附带说明,如果您不熟悉Python,那么您真的不应该在学习Python 2上投入精力。请考虑安装Python 3并将精力集中在此方面。