跳转到主要内容

Vladiate是CSV文件的严格验证工具

项目描述

https://github.com/di/vladiate/actions/workflows/test.yml/badge.svg?query=branch%3Amaster+event%3Apush https://coveralls.io/repos/di/vladiate/badge.svg?branch=master

描述

Vladiate帮助您为CSV文件的每个字段编写明确的断言。

功能

使用纯Python编写验证模式

没有UI,没有XML,没有JSON,只有代码。

编写自己的验证器

Vladiate默认提供了一些,但没有理由您不能编写自己的。

一次性验证多个文件

可以使用相同的模式,也可以使用不同的模式。

文档

安装

安装

$ pip install vladiate

快速入门

以下是一个示例vladfile.py

from vladiate import Vlad
from vladiate.validators import UniqueValidator, SetValidator
from vladiate.inputs import LocalFile

class YourFirstValidator(Vlad):
    source = LocalFile('vampires.csv')
    validators = {
        'Column A': [
            UniqueValidator()
        ],
        'Column B': [
            SetValidator(['Vampire', 'Not A Vampire'])
        ]
    }

在这里我们定义了多个用于本地文件vampires.csv的验证器,它看起来像这样

Column A,Column B
Vlad the Impaler,Not A Vampire
Dracula,Vampire
Count Chocula,Vampire

然后我们在与您的.csv文件相同的目录中运行vladiate

$ vladiate

并且得到以下输出

Validating YourFirstValidator(source=LocalFile('vampires.csv'))
Passed! :)

处理更改

让我们想象你已经得到了一个新的CSV文件,potential_vampires.csv,看起来像这样

Column A,Column B
Vlad the Impaler,Not A Vampire
Dracula,Vampire
Count Chocula,Vampire
Ronald Reagan,Maybe A Vampire

如果我们更新我们的第一个验证器以使用此文件,如下所示

- class YourFirstValidator(Vlad):
-     source = LocalFile('vampires.csv')
+ class YourFirstFailingValidator(Vlad):
+     source = LocalFile('potential_vampires.csv')

我们会得到以下错误

Validating YourFirstFailingValidator(source=LocalFile('potential_vampires.csv'))
Failed :(
  SetValidator failed 1 time(s) (25.0%) on field: 'Column B'
    Invalid fields: ['Maybe A Vampire']

我们会知道我们可能需要清理这个字段,或者将其添加到SetValidator中。

从头开始

为了使编写新的vladfile.py变得简单,Vladiate会提供有意义的错误信息。

假设以下内容为real_vampires.csv

Column A,Column B,Column C
Vlad the Impaler,Not A Vampire
Dracula,Vampire
Count Chocula,Vampire
Ronald Reagan,Maybe A Vampire

我们可以编写一个裸骨验证器如下

class YourFirstEmptyValidator(Vlad):
    source = LocalFile('real_vampires.csv')
    validators = {}

运行这个vladiate会给出以下错误

Validating YourFirstEmptyValidator(source=LocalFile('real_vampires.csv'))
Missing...
  Missing validators for:
    'Column A': [],
    'Column B': [],
    'Column C': [],

Vladiate期望为每个列指定某些内容,即使是空列表(关于这一点稍后讨论)。我们可以轻松地从错误中复制并粘贴到我们的vladfile.py中,以使其

class YourFirstEmptyValidator(Vlad):
    source = LocalFile('real_vampires.csv')
    validators = {
        'Column A': [],
        'Column B': [],
        'Column C': [],
    }

当我们用vladiate运行这个时,我们得到

Validating YourSecondEmptyValidator(source=LocalFile('real_vampires.csv'))
Failed :(
  EmptyValidator failed 4 time(s) (100.0%) on field: 'Column A'
    Invalid fields: ['Dracula', 'Vlad the Impaler', 'Count Chocula', 'Ronald Reagan']
  EmptyValidator failed 4 time(s) (100.0%) on field: 'Column B'
    Invalid fields: ['Maybe A Vampire', 'Not A Vampire', 'Vampire']
  EmptyValidator failed 4 time(s) (100.0%) on field: 'Column C'
    Invalid fields: ['Real', 'Not Real']

这是因为Vladiate将字段的空验证器列表解释为EmptyValidator,它期望每个字段都是空字符串。这有助于我们在vladfile.py中添加验证器时做出有意义的决策。它还确保我们没有忘记空列或字段。

内置验证器

Vladiate自带了一些常见的内置验证器

class Validator

通用验证器。应由任何自定义验证器继承。直接使用。

class CastValidator

通用的“可转换为-x”验证器。应由任何转换测试验证器继承。直接使用。

class IntValidator

验证字段是否可以转换为int类型。

empty_ok=False:

指定是否忽略空字符串字段。

class FloatValidator

验证字段是否可以转换为float类型。

empty_ok=False:

指定是否忽略空字符串字段。

class SetValidator

验证字段是否在指定的可能字段集中。

valid_set=[]:

有效可能字段的列表

empty_ok=False:

默认情况下,将空字符串添加到指定的集中。

ignore_case=False:

忽略列值和有效集中值的大小写。

class UniqueValidator

确保给定的字段在任何其他列中不重复。可以通过unique_with选项与行中的其他字段一起确定“唯一性”。

unique_with=[]:

使主字段唯一化的字段名列表。

empty_ok=False:

指定是否忽略空字符串字段。

class RegexValidator

使用re.match()验证字段是否匹配给定的正则表达式。

pattern=r'di^':

正则表达式模式。默认情况下,对所有字段失败。

full=False:

指定是否应该使用fullmatch()或match()。

empty_ok=False:

指定是否忽略空字符串字段。

class RangeValidator

验证字段是否在给定的范围内(包含)。可以处理整数或浮点数。

low:

范围的低值。

high:

范围的高值。

empty_ok=False:

指定是否忽略空字符串字段。

class EmptyValidator

确保字段始终为空。本质上与空SetValidator相同。当字段没有验证器时默认使用。

class NotEmptyValidator

EmptyValidator相反。确保字段永远不会为空。

Ignore

总是通过验证。用于显式忽略给定列。

RowValidator

通用行验证器。应由任何自定义验证器继承。不能直接使用。

RowLengthValidator

验证每行都有预期的字段数。预期的字段数从由csv.DictReader读取的CSV头行推断得出。

内置输入类型

Vladiate附带以下输入类型

VladInput

通用输入。应由任何自定义输入继承。不能直接使用。

LocalFile

从文件系统中本地文件读取。

filename:

本地CSV文件的路径。

S3File

从S3中的文件读取。可以指定完整路径,也可以指定桶/键对。

需要boto库,该库应通过pip install vladiate[s3]安装。

path=None:

完整的S3文件路径(例如,s3://foo.bar/path/to/file.csv

bucket=None:

S3桶。必须与键一起指定。

key=None:

S3键。必须与桶一起指定。

String

从字符串中读取CSV。可以接受一个str或一个StringIO

:string_input=None

常规Python字符串输入。

:string_io=None

StringIO输入。

以编程方式运行Vlads

Vlad

以编程方式初始化Vlad程序

source:

必需。任何VladInput

validators={}:

验证器列表。可选,如果设置,则默认为类变量validators,否则为所有字段使用EmptyValidator

delimiter=',':

您csv源中使用的分隔符。可选,默认为,

ignore_missing_validators=False:

如果有字段在文件中,而Vlad没有验证器,则是否失败验证。可选,默认为False

quiet=False:

是否禁用验证生成的日志输出。可选,默认为False

file_validation_failure_threshold=None:

达到此失败阈值后停止验证文件。输入一个介于0.01.0之间的值。1.0`(100%)`验证整个文件。可选,默认为`None

例如

from vladiate import Vlad
from vladiate.inputs import LocalFile
Vlad(source=LocalFile('path/to/local/file.csv')).validate()

测试

运行测试

make test

运行lint工具

make lint

命令行参数

Usage: vladiate [options] [VladClass [VladClass2 ... ]]

Options:
  -h, --help            show this help message and exit
  -f VLADFILE, --vladfile=VLADFILE
                        Python module file to import, e.g. '../other.py'.
                        Default: vladfile
  -l, --list            Show list of possible vladiate classes and exit
  -V, --version         show version number and exit
  -p PROCESSES, --processes=PROCESSES
                        attempt to use this number of processes, Default: 1
  -q, --quiet           disable console log output generated by validations

贡献者

许可证

开源MIT许可证。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分发

vladiate-0.0.26.tar.gz (21.4 kB 查看哈希值)

上传时间

构建分发

vladiate-0.0.26-py3-none-any.whl (15.4 kB 查看哈希值)

上传时间 Python 3

支持者