描述csv数据结构的模块。
CsvSchema的Python项目详细描述
csvschema是一个易于使用的模块,旨在使csv文件检查更容易。它允许更快地创建更复杂的验证规则,这要归功于 一些预定义的构造块。
基本知识
像大多数为csv文件检查而构建的类似模块一样,csvschema允许您描述正确的文件应该是什么样子。 为此,您需要实现csv_schema.structure.BaseCsvStructure的子类。
示例:
from csv_schema.structure.base import BaseCsvStructure from csv_schema.columns import ( IntColumn, DecimalColumn, StringColumn, ) class TestCsvStructure(BaseCsvStructure): a = StringColumn() b = IntColumn() c = DecimalColumn()
在上面的例子中,我们定义了csv模式类,该类用三列表示文件。第一列可以包含任何类型的字符。 第二个只允许数值,第三个只能包含十进制值。
- 注释: schema类中属性的顺序很重要。如果将b放在a之前,那么csv文件中的b列将是第一个。 当然,这将更改验证,第一列将不再允许像'Python'这样的值
定义模式后,您可以这样使用它:
schema = TestCsvStructure(['A', '6', ''], 1) schema.is_valid()
第一个构造函数参数是表示单行表单csv文件的数据列表。第二个是文件中的位置。
- 注释:
- 您可以使用任何您喜欢的csv读取方法。只要确保每个csv行都转换成list即可。
如果is_valid返回False,则可以看到在schema.errors中找到的错误。每个错误消息都有两种格式:
- line<;行号>;:<;错误消息>;当错误消息应用于整行时
- line<;行号>;,<;列号>;:<;错误消息>;当错误消息应用于特定列时
有关列的详细信息
有三种类型的列。它们的行为可以通过一些附加的关键字参数来改变:
StringColumn([blank, min_length, max_length, permissible_values]): | |
---|---|
| |
IntColumn([blank, min_exclusive, max_exclusive, min_inclusive, max_inclusive]): | |
| |
DecimalColumn([blank, min_exclusive, max_exclusive, min_inclusive, max_inclusive, fraction_digits, total_digits]): | |
|
- 注释:
- DecimalColumn操作decimal.Decimal对象。在设置min_exclusive,max_exclusive时,请记住这一点, min_inclusive或max_inclusive。
记住,只需对csv_schema.columns.base.BaseColumn:
进行子类化,就可以创建自己的列。from csv_schema.columns.base import BaseColumn from csv_schema.exceptions import ImproperValueRestrictionException class MyColumn(BaseColumn): value_template = '' # Regular expression describing how proper value should look like in CSV file def convert(self, raw_val): # This method is called in order to transform raw value into Python object return None def check_restriction(self, value): # This method is optional. It allows you to specify keyword arguments that can alter column behavior. required_value = self.options.get('required_value', None) if required_value is not None: if required_value != value: # Message from ImproperValueRestrictionException will be added to structure errors raise ImproperValueRestrictionException('That is not the value you are looking for...')
列集合
到目前为止,您已经了解了如何使用csvschema进行简单的csv文件描述。有时仅仅指定列的类型及其行为是不够的。 如果您想描述更复杂的验证规则呢?假设你想要一个验证规则,上面写着:你必须填写 A列或B列或两者。这是需要Cs对象的情况。
Cs代表列集合,允许您通过简单地将Cs与一些逻辑运算符结合来表示更复杂的验证规则。 让我们考虑一下前面提到的简单验证规则:您必须填写A列或B列,或者两者都填写:
from csv_schema.structure.set import Cs class TestCsvStructure(BaseCsvStructure): a = IntColumn(blank=True) b = IntColumn(blank=True) class Rules(object): a_or_b_rule = Cs('a') | Cs('b')
changed in 1.1.0:csvschema现在将规则存储在特殊的内部类规则中
- 注释:
- 如果要使用列集合remeber将Cs实例中使用的列设置为blank
每个Cs实例都分配了需要填充的列,以便将Cs计算为true。在我们的示例中,每个Cs实例都有 只有一列,但您可以根据需要分配它们。例如,如果您创建这样的Cs实例:
Cs('a', 'b')
这意味着您希望列、a和b都被填充,因为Cs将求值true仅当every列被填充时。 我们使用|运算符组合两个Cs。|可以被称为要求至少一个Cs实例被计算为true的规则。 Cs还支持^运算符。它用于表示只要求一个Cs实例到bE填充。如果创建规则Cs('a') ^ Cs('b') 并填充这两列,整个表达式将被计算为false。
- 注释:
在is_valid()调用期间计算定义的规则,并将其错误消息添加到结构errors属性中。如果自定义错误消息 不适合您的需要您可以通过对整个规则调用error方法来覆盖它:
... class Rules(object): a_or_b_rule = (Cs('a') | Cs('b')).error('Column A or B needs to be filled') ...
如果要在单个结构类中定义多个规则,可以这样做:
... class Rules(object): rule_1 = Cs('a') | Cs('b') rule_2 = Cs('c') ^ (Cs('d') | Cs('e')) ...
与列类似,Cs行为可以通过关键字参数进行更改:
... class Rules(object): rule = Cs('a', b='B') ...
在上面的示例中,如果列a已填充且列b的值等于'B',则将对Cs实例进行求值true。 下表显示了可能的Cs状态,具体取决于不同的数据和设置:
Setting | Column ^{tt3}$ | Column ^{tt2}$ | Evaluation |
---|---|---|---|
Cs(‘a’) | ‘’ | ‘’ | False |
Cs(‘a’) | ‘A’ | ‘’ | True |
Cs(‘a’) | ‘’ | ‘B’ | False |
Cs(‘a’) | ‘A’ | ‘B’ | True |
Cs(‘a’, b=’B’) | ‘’ | ‘’ | True |
Cs(‘a’, b=’B’) | ‘A’ | ‘’ | False |
Cs(‘a’, b=’B’) | ‘’ | ‘B’ | False |
Cs(‘a’, b=’B’) | ‘A’ | ‘B’ | True |
Cs(‘a’, b=’B’) | ‘’ | ‘C’ | True |
Cs(‘a’, b=’B’) | ‘A’ | ‘C’ | False |
请注意,当列b为空或具有错误值时,不能填充列a。
- 注释:
请记住,Cs中可以有多个值条件。创建这样的对象:
Cs('a', b='B', c='C')
如果b等于'B',并且c等于'C'(当然,a不是空的),则将使其成为true。 您甚至可以要求特定列必须具有特定值:
Cs('a', a='A')