Python 使用Pyvaru进行批量数据(CSV)验证

Python 使用Pyvaru进行批量数据(CSV)验证,python,validation,csv,python-3.5,Python,Validation,Csv,Python 3.5,我正在寻找一个通用的验证器模块,以协助清理数据,重要的是,返回一个错误日志,说明数据被拒绝的原因。我主要处理CSV文件,每个文件平均有40列,大约有40000行。CSV文件将包含个人身份信息、联系信息以及他们与我们持有的帐户的详细信息 例如 名字|姓氏|其他姓名|护照号码|出生日期|电话号码|电子邮件地址|实际地址|账号|发票号码|开立日期|到期金额|到期日期|等 我需要验证基本内容,如数据类型,数据长度,选项/选项,范围,必填字段等。此外还有条件验证,例如,如果提供了到期金额值,则还必须提供到

我正在寻找一个通用的验证器模块,以协助清理数据,重要的是,返回一个错误日志,说明数据被拒绝的原因。我主要处理CSV文件,每个文件平均有40列,大约有40000行。CSV文件将包含个人身份信息、联系信息以及他们与我们持有的帐户的详细信息

例如

名字|姓氏|其他姓名|护照号码|出生日期|电话号码|电子邮件地址|实际地址|账号|发票号码|开立日期|到期金额|到期日期|等

我需要验证基本内容,如
数据类型
数据长度
选项/选项
范围
必填字段
等。此外还有条件验证,例如,如果提供了
到期金额
值,则还必须提供
到期日期
。如果没有,那么我会提出一个错误


提供了一些基本的验证类。是否可以使用pyvaru实现基本验证和条件验证这两种场景?如果是,我将如何构造验证。我必须创建对象,例如标识符对象,然后为我使用pyvaru创建帐户对象吗?

pyvaru验证python对象(类实例和集合,如字典、列表等),因此从CSV开始,我将使用。 因此,假设CSV类似于:

policyID,statecode,county,eq_site_limit,hu_site_limit,fl_site_limit,fr_site_limit,tiv_2011,tiv_2012,eq_site_deductible,hu_site_deductible,fl_site_deductible,fr_site_deductible,point_latitude,point_longitude,line,construction,point_granularity
119736,FL,CLAY COUNTY,498960,498960,498960,498960,498960,792148.9,0,9979.2,0,0,30.102261,-81.711777,Residential,Masonry,1
448094,FL,CLAY COUNTY,1322376.3,1322376.3,1322376.3,1322376.3,1322376.3,1438163.57,0,0,0,0,30.063936,-81.707664,Residential,Masonry,3
206893,FL,CLAY COUNTY,190724.4,190724.4,190724.4,190724.4,190724.4,192476.78,0,0,0,0,30.089579,-81.700455,Residential,Wood,1
333743,FL,CLAY COUNTY,0,79520.76,0,0,79520.76,86854.48,0,0,0,0,30.063236,-81.707703,Residential,Wood,3
172534,FL,CLAY COUNTY,0,254281.5,0,254281.5,254281.5,246144.49,0,0,0,0,30.060614,-81.702675,Residential,Wood,1
验证代码类似于:

import csv
from pyvaru import Validator
from pyvaru.rules import MaxLengthRule, MaxValueRule


class CsvRecordValidator(Validator):
    def get_rules(self) -> list:
        record: dict = self.data
        return [
            MaxLengthRule(apply_to=record.get('statecode'),
                          label='State Code',
                          max_length=2),
            MaxValueRule(apply_to=record.get('eq_site_limit'),
                         label='Site limit',
                         max_value=40000),
        ]


with open('sample.csv', 'r') as csv_file:
    reader = csv.DictReader(csv_file)
    row = 0
    for record in reader:
        row += 1
        validator = CsvRecordValidator(record)
        validation = validator.validate()
        if not validation.is_successful():
            print(f'Row {row} did not validate. Details: {validation.errors}')
上面的例子只是一个愚蠢的例子,它检查“statecode”列的最大长度是否为2,“eq_site_limit”的最大值是否为40k。 通过对抽象类
ValidationRule
进行子类化并实现
apply()
方法,您可以实现自己的规则:

class ContainsHelloRule(ValidationRule):
    def apply(self) -> bool:
        return 'hello' in self.apply_to
也可以使用位运算符来否定规则。。。例如,通过使用前面的自定义规则检查字符串mst是否包含“hello”,您可以编写:

~ContainsHelloRule(apply\u to=a\u字符串,label=“a测试字符串”)

因此,只有当字符串不包含“hello”字符串时,该规则才有效


还可以验证CSV记录,而无需字典转换,方法是使用带有验证正则表达式的
PatternRule
验证每一行。。。但您当然不知道哪列值无效。

我们如何提供PatternRule模式?我们如何为FutureDateRule提供日期?