描述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]):
  • blank
    If set to ^{tt9}$ column does not has to be filled
  • min_length
    Value can not be shorter that ^{tt10}$
  • max_length
    Maximal lenght of value
  • permissible_values
    List of allowed values
IntColumn([blank, min_exclusive, max_exclusive, min_inclusive, max_inclusive]):
  • blank
    If set to ^{tt9}$ column does not has to be filled
  • min_exclusive
    Minimum allowed value, exclusive
  • max_exclusive
    Maximal allowed value, exclusive
  • min_inclusive
    Minimum allowed value, inclusive
  • max_inclusive
    Maximal allowed value, inclusive
DecimalColumn([blank, min_exclusive, max_exclusive, min_inclusive, max_inclusive, fraction_digits, total_digits]):
  • blank
    If set to ^{tt9}$ column does not has to be filled
  • min_exclusive
    Minimum allowed value, exclusive
  • max_exclusive
    Maximal allowed value, exclusive
  • min_inclusive
    Minimum allowed value, inclusive
  • max_inclusive
    Maximal allowed value, inclusive
  • fraction_digits
    Number of digits before comma
  • total_digits
    Total number of digits in whole value (before and after comma)
注释
DecimalColumn操作decimal.Decimal对象。在设置min_exclusivemax_exclusive时,请记住这一点, min_inclusivemax_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')

这意味着您希望列、ab都被填充,因为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状态,具体取决于不同的数据和设置:

SettingColumn ^{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')

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java用arraylist中的单词替换txt文件中的单词?   java为ProgressBar提供了一个解决方案。是否接受整数?   java添加鼠标侦听器以删除目标   java删除标点符号的简单程序   java JavaScriptException:(TypeError):无法调用null的方法“getBoundingClientRect”   java我可以在没有对话框的情况下卸载应用程序吗?   执行泛型Java类   如果主线程从不调用线程,那么线程中断的原因是什么。中断()?   导致其他组件不显示的java绘制方法   java ObjectMapper追加文件JSON   Netbeans Java:将我的CSV文件放在哪里?   bouncycastle RSAKeyParameters中的java公钥   java为什么我总是在这个字符串数组中输入a1字符串?   java使用匿名绑定连接到AD并搜索用户DN   从JSP文件向Java应用程序发送socket?