在python中使用表模式的实用程序库

tableschema的Python项目详细描述


表模式py

travis工作服pypisemvergitter<

在python中使用表模式的库。

功能

  • 使用表架构描述的数据表
  • 模式表示表模式
  • 字段表示表架构字段
  • 验证以验证表架构
  • 推断从数据推断表模式
  • 用于验证和推断模式的内置命令行界面
  • 存储/插件系统将表连接到不同的存储后端,如SQL数据库

开始吸气

安装

包使用语义版本控制。这意味着主要版本可能包括破坏性更改。强烈建议在设置/要求文件中指定表模式版本范围,例如表模式

$ pip install tableschema

示例

本自述中的代码示例需要Python3.4+解释器。您可以在示例目录中看到更多示例。

fromtableschemaimportTable# Create tabletable=Table('path.csv',schema='schema.json')# Print schema descriptorprint(table.schema.descriptor)# Print cast rows in a dict formforkeyed_rowintable.iter(keyed=True):print(keyed_row)

文档

表格是表格数据世界的核心概念。它用元数据(表模式)表示数据。让我们看看如何在实践中使用它。

假设我们有一些本地csv文件。它可以是内联数据或远程链接-都由table类支持(当然,在浏览器中使用的本地文件除外)。但假设现在是data.csv

city,location
london,"51.50,-0.11"
paris,"48.85,2.30"
rome,N/A

让我们创建并读取一个表。我们使用statictable.load方法和table.read方法和键控选项来获取键控行数组:

table=Table('data.csv')table.headers# ['city', 'location']table.read(keyed=True)# [#   {city: 'london', location: '51.50,-0.11'},#   {city: 'paris', location: '48.85,2.30'},#   {city: 'rome', location: 'N/A'},# ]

我们可以看到我们的位置只是一条线。但应该是地质点。罗马的位置也不可用,但它也是一个n/a字符串,而不是javascriptnull。首先我们必须推断表模式:

table.infer()table.schema.descriptor# { fields:#   [ { name: 'city', type: 'string', format: 'default' },#     { name: 'location', type: 'geopoint', format: 'default' } ],#  missingValues: [ '' ] }table.read(keyed=True)# Fails with a data validation error

让我们修复不可用的位置。表架构规范中有一个missingValues属性。作为第一次尝试,我们在table.schema.descriptor中将missingValues设置为n/a。架构描述符可以就地更改,但所有更改都应该由tabl提交e.schema.commit()

table.schema.descriptor['missingValues']='N/A'table.schema.commit()table.schema.valid# falsetable.schema.errors# [<ValidationError: "'N/A' is not of type 'array'">]

作为一个优秀的citiziens,我们决定检查模式描述符的有效性。这是无效的!我们应该为missingValues属性使用数组。也不要忘记将空字符串作为缺少的值:

table.schema.descriptor['missingValues']=['','N/A']table.schema.commit()table.schema.valid# true

一切都好。看来我们已经准备好再次读取数据:

table.read(keyed=True)# [#   {city: 'london', location: [51.50,-0.11]},#   {city: 'paris', location: [48.85,2.30]},#   {city: 'rome', location: null},# ]

现在我们看到:

由于数据读取没有错误,我们可以确保我们的数据在模式中是有效的。让我们保存它:

table.schema.save('schema.json')table.save('data.csv')

我们的data.csv看起来是一样的,因为它已经被严格化为csv格式。但现在我们有了schema.json

$ pip install tableschema
0

如果我们决定进一步改进它,我们可以更新模式文件,然后再次打开它。但现在提供一个模式路径:

$ pip install tableschema
1

这只是对类的基本介绍。要了解更多信息,让我们查看类api参考。

表(source,schema=none,strict=false,post_cast=[],storage=none,**选项)

要实例化类的构造函数。如果提供了引用,则在任何读取操作中将检查外键。

  • 源(str/list[])-数据源(其中之一):
    • 本地文件(路径)
    • 远程文件(URL)
    • 表示行的数组数组
  • 模式(任意)-所有形式的数据模式,由模式支持
  • strict(bool)-传递到架构的严格选项构造函数
  • 后转换(函数[])-后转换处理器列表
  • 存储(none/str)-存储名称,如sqlbigquery
  • 选项(dict)-制表器或存储选项
  • (exceptions.tableSchemaException)-引发表创建过程中发生的任何错误
  • (表)-返回数据表类实例

表格标题

  • (str[])-返回数据源头

表.架构

  • (schema)-返回schema类实例

table.iter(keyed=fase,extended=false,cast=true,relations=false)

iter通过表数据并发出基于表模式的行转换。可以禁用数据广播。

  • 键控(bool)-iter键控行
  • 扩展(bool)-iter扩展行
  • 强制转换(bool)-如果为false,则禁用数据强制转换
  • 关系(dict)-外键引用的dict形式为{resource1:[{field1:value1,field2:value2},…],…}。如果提供外键字段,将选中并解析为其引用
  • (exceptions.tableSchemaException)-引发此进程中发生的任何错误
  • (any[]/any{})-生成行:
    • [value1,value2]-base
    • {header1:value1,header2:value2}-keyed
    • [行号,[header1,header2],[value1,value2]]-扩展

table.read(keyed=false,extended=false,cast=true,relations=false,limit=none)

读取整个表并以行数组的形式返回。行数可以限制。

  • 键控(bool)-发出键控行的标志
  • 扩展(bool)-发出扩展行的标志
  • 强制转换(bool)-如果为false,则禁用数据强制转换的标志
  • 关系(dict)-外键引用的dict形式为{resource1:[{field1:value1,field2:value2},…],…}。如果提供外键字段,则将检查并解析为其refeReals
  • 限制(int)-要返回的行的整数限制
  • (exceptions.tableSchemaException)-引发此进程中发生的任何错误
  • (list[])-返回行数组(请参见table.iter

表.推断(极限=100,置信度=0.75)

推断表的架构。它将根据表数据推断表模式并将其设置为table.schema

  • 限制(int)-限制行样本大小
  • 置信度(float)-允许多少铸造错误(以比率表示,介于0和1之间)
  • (dict)-返回表架构描述符

表.保存(目标,存储=无,**选项)

< Buff行情>

要保存架构,请使用table.schema.save()

使用(逗号)分隔符将数据源以csv格式保存到本地文件

  • 目标(str)-保存目标(例如文件路径)
  • 存储(none/str)-存储名称,如sqlbigquery
  • 选项(dict)-制表器或存储选项
  • (exceptions.tableSchemaException)-如果存在保存问题,则引发错误
  • (true/storage)-返回true或存储实例

模式

模式的一种模型,具有处理模式和支持数据的有用方法。架构实例可以用架构源作为json文件或json对象的url来初始化。架构最初被验证(请参见下面的验证)。默认情况下,验证错误将存储在schema.errors中,但在严格模式下,会立即引发验证错误。

让我们创建一个空白模式。它无效,因为表架构需要descriptor.fields属性。规范:

$ pip install tableschema
2

要避免手工创建模式描述符,我们将使用schema.infer方法从给定的数据推断描述符:

$ pip install tableschema
3

现在我们有了一个推断的模式,它是有效的。我们可以根据我们的模式来转换数据行。我们提供一个输入字符串,输出将相应地进行转换:

$ pip install tableschema
4

但是,如果我们尝试为age字段强制转换提供一些缺少的值,则会失败,因为目前只有一个可能缺少的值是空字符串。让我们更新我们的模式:

$ pip install tableschema
5

我们可以将架构保存到本地文件。我们可以随时从本地文件加载工作:

$ pip install tableschema
6

这只是模式类的基本介绍。要了解更多信息,让我们看看schemaclass api引用。

架构(描述符,strict=false)

要实例化架构的构造函数类。

  • 描述符(str/dict)-架构描述符:
    • 本地路径
    • 远程URL
    • 字典
  • strict(bool)-更改验证行为的标志:
    • 如果不引发假错误,则所有错误都将收集到架构中。错误
    • 如果strict为true,则将立即引发任何验证错误
  • (exceptions.tableSchemaException)-引发进程中发生的任何错误
  • (schema)-返回schema类实例

架构。有效

  • (bool)-返回验证状态。在严格模式下总是正确的。

架构。错误

  • (异常[])-返回验证错误。在严格模式下总是空的。
模式描述符
  • (dict)-返回模式描述符

模式.主键

  • (str[])-返回scHEMA主键

架构。外键

  • (dict[])-返回架构外键

架构字段

  • (field[])-返回字段的数组实例

架构.字段名

  • (str[])-返回字段名数组。

schema.get_字段(名称)

按名称获取架构字段。

注意:如果要修改字段描述符,请使用更新字段

  • 名称(str)-架构字段名
  • (field/none)-返回字段实例,如果未找到则返回空值

schema.add_field(描述符)

将新字段添加到架构。将使用新添加的字段描述符验证架构描述符。

  • 描述符(dict)-字段描述符
  • (exceptions.tableSchemaException)-引发进程中发生的任何错误
  • (field/none)-返回added字段实例,如果未添加则返回null

schema.update_字段(名称,更新)

按名称更新现有描述符字段

  • 名称(str)-架构字段名
  • 更新(dict)-更新以应用于字段的描述符
  • (bool)-成功时返回true,如果未找到要修改的字段,则返回false

cfschema.commit()示例

架构。删除字段(名称)

按名称删除字段资源。删除字段描述符后,将验证架构描述符。

  • 名称(str)-架构字段名
  • (exceptions.tableSchemaException)-引发进程中发生的任何错误
  • (field/none)-返回removed字段实例,如果找不到则返回null

schema.cast_row(row)

根据字段类型和格式转换行。

  • 行(任意[])-数据行作为值数组
  • (任意[])-返回强制转换数据行

schema.infer(行,头=1,置信度=0.75,猜测器=none,解析器=none)

根据数据样本推断并设置schema.descriptor

  • 行(list[])-表示行的数组数组。
  • 头(int/str[])-数据示例头(其中之一):
    • 包含标题的行号(应包含标题行)
    • 标题数组(不应包含标题行)
  • 置信度(float)-允许多少铸造错误(以比率表示,介于0和1之间)
  • 猜测器&;解析器-您可以通过提供类型猜测和类型解析类来实现推理策略[实验性]
  • {dict}-返回表架构描述符

schema.commit(strict=none)

如果描述符中存在更改,请更新架构实例。

  • strict(bool)-alterstrict下一步工作模式
  • (exceptions.tableSchemaException)-引发进程中发生的任何错误
  • (bool)-成功时返回true,未修改时返回false
$ pip install tableschema
7

schema.save(目标)

将架构描述符保存到目标目标目标。

  • 目标(str)-保存描述符的路径
  • (exceptions.tableSchemaException)-引发进程中发生的任何错误
  • (bool)-成功时返回true

字段

$ pip install tableschema
8

数据值可以通过字段实例强制转换为本机python对象。类型实例可以用字段描述符。这允许定义格式和约束。

强制转换值将检查该值是否为预期类型、格式是否正确以及是否符合架构所施加的任何约束。例如,日期值(iso 8601格式)可以与日期类型实例一起转换。无法转换的值将引发invalidcasterror异常。

转换不满足约束的值将引发constraintror异常。

下面是字段的api引用类:

新字段(描述符,缺失值=['')

构造函数来实例化字段类。

  • 描述符(dict)-模式字段描述符
  • missingValues(str[])-一个带有字符串的数组,表示缺少的值
  • (exceptions.tableSchemaException)-引发进程中发生的任何错误
  • (字段)-返回字段类实例

字段名

  • (str)-返回字段名

字段。键入

  • (str)-返回字段类型

字段.格式
  • (str)-返回字段格式

字段。必需的

  • (bool)-如果需要字段,则返回true

字段.约束条件
  • (dict)-返回具有字段约束的对象

字段描述符

  • (dict)-返回字段描述符

字段.castValue(值,约束=真)

根据字段类型和格式转换给定值。

  • 值(任意)-要对字段强制转换的值
  • 约束(boll/str[])-获取约束配置
    • 可以将其设置为true以禁用约束检查
    • 它可以是一个要检查的约束数组,例如.['minimum','maximum']
  • (exceptions.tableSchemaException)-引发进程中发生的任何错误
  • (任意)-返回强制转换值

字段.测试值(值,约束=真)

测试值是否与字段相符。

  • 值(任意)-要对字段强制转换的值
  • 约束(bool/str[])-约束配置
  • (bool)-如果值符合字段,则返回

验证

将模式作为json文件、json文件的url或python dict,validate返回有效表模式的true,或引发异常,exceptions.validationerror。它只验证模式,而不是针对模式的数据!

$ pip install tableschema
9

验证(描述符)

验证表架构描述符。

  • 描述符(str/dict)-架构描述符(其中之一):
    • 本地路径
    • 远程URL
    • 对象
  • (exceptions.validationerror)-无效时引发
  • (bool)-有效时返回true

推断

给定头和数据,infer将根据数据值以python dict的形式返回表模式。给定数据文件,data_to_infer.csv

fromtableschemaimportTable# Create tabletable=Table('path.csv',schema='schema.json')# Print schema descriptorprint(table.schema.descriptor)# Print cast rows in a dict formforkeyed_rowintable.iter(keyed=True):print(keyed_row)
0

我们为这个文件调用infer

fromtableschemaimportTable# Create tabletable=Table('path.csv',schema='schema.json')# Print schema descriptorprint(table.schema.descriptor)# Print cast rows in a dict formforkeyed_rowintable.iter(keyed=True):print(keyed_row)
1

infer使用的行数可以使用limit参数进行限制。

推断(源,标题=1,限制=100,置信度=0.75,**选项)

推断源架构。

  • 源(任意)-源作为路径、url或内联数据
  • 标题(int/str[])-标题行数或标题列表
  • 置信度(float)-允许多少铸造错误(以比率表示,介于0和1)
  • (exceptions.tableSchemaException)-引发进程中发生的任何错误
  • (dict)-返回模式描述符

例外情况

异常.tableSchemaException

所有库异常的基类。如果有多个错误,可以从异常对象中读取:

fromtableschemaimportTable# Create tabletable=Table('path.csv',schema='schema.json')# Print schema descriptorprint(table.schema.descriptor)# Print cast rows in a dict formforkeyed_rowintable.iter(keyed=True):print(keyed_row)
2

异常。加载错误

所有加载错误。

异常.validationerror

所有验证错误。

异常。casterror

所有值转换错误。

异常。关系错误

所有完整性错误。

异常。存储错误

所有存储错误。

存储

该库包含接口声明,以实现表格式存储。此接口允许使用不同的数据存储系统,如sql和tableschema.table类(加载/保存)以及数据包级别:

storagefromtableschemaimportTable# Create tabletable=Table('path.csv',schema='schema.json')# Print schema descriptorprint(table.schema.descriptor)# Print cast rows in a dict formforkeyed_rowintable.iter(keyed=True):print(keyed_row)3

存储连接(名称,**选项)

根据存储名称创建表格存储。

  • 名称(str)-类似于SQL的存储名称
  • 选项(dict)-具体存储选项
  • (exceptions.storageerror)-任何错误都会引发
  • (存储)-返回存储实例

实现者应该遵循tableschema.storage接口来编写自己的存储后端。具体的存储后端可以包括特定于conrete存储系统的附加功能。请参见下面的"插件"系统,了解如何将自定义存储插件集成到您的工作流中。

<;<;interface>;>storage(**选项)

创建表格存储。实现应该完全实现这个接口,以便与存储api兼容。

  • 选项(dict)-具体存储选项
  • (exceptions.storageerror)-任何错误都会引发
  • (存储)-返回存储实例

存储.存储桶

返回存储桶名称列表。bucket是一个特殊的术语,其含义与表中的术语几乎相同。您应该将bucket视为存储在存储器中的

  • (exceptions.storageerror)-任何错误都会引发
  • str[]-返回存储桶名称列表

创建(bucket,descriptor,force=false)

创建一个/多个存储桶。

  • 存储桶(str/list)-存储桶名称或存储桶名称列表
  • 描述符(dict/dict[])-模式描述符或描述符列表
  • 强制(bool)-删除并重新创建已存在的存储桶
  • (exceptions.storageerror)-任何错误都会引发

删除(bucket=none,ignore=false)

删除一个/多个/所有存储桶。

  • bucket(str/list/none)-要删除的bucket名称或bucket名称列表。如果没有,将删除所有存储桶
  • 描述符(dict/dict[])-模式描述符或描述符列表
  • 忽略(bool)-从存储中删除不存在的存储桶时不会引发错误
  • (exceptions.storageerror)-rais任何错误的ES

描述(bucket,descriptor=none)

获取/设置bucket的表架构描述符。

  • 存储桶(str)-存储桶名称
  • 描述符(dict/none)-要设置的架构描述符
  • (exceptions.storageerror)-任何错误都会引发
  • (dict)-返回表架构描述符

iter(桶)

此方法应根据此存储桶的架构输入值。

  • 存储桶(str)-存储桶名称
  • (exceptions.storageerror)-任何错误都会引发
  • (list[])-生成数据行

读取(存储桶)

此方法应根据此存储桶的架构读取类型化值。

  • 存储桶(str)-存储桶名称
  • (exceptions.storageerror)-任何错误都会引发
  • (list[])-返回数据行

写入(存储桶,行)

此方法将数据行写入存储中。它应该在内部将不支持类型的值存储为字符串(就像csv那样)。

  • 存储桶(str)-存储桶名称
  • 行(list[])-要写入的数据行
  • (exceptions.storageerror)-任何错误都会引发

插件

表架构有一个插件系统。任何名为tableschema<;name>;的包都可以导入为:

fromtableschemaimportTable# Create tabletable=Table('path.csv',schema='schema.json')# Print schema descriptorprint(table.schema.descriptor)# Print cast rows in a dict formforkeyed_rowintable.iter(keyed=True):print(keyed_row)
4

如果未安装插件,importorror将显示一条消息,说明如何安装插件。

官方插件

CLI

< Buff行情>

这是一个临时api,不包括在semver中。如果您将其用作其他程序的一部分,请将具体的tableschema版本固定到您的需求文件中。

表模式具有一个名为table schema的cli。此cli公开infervalidate函数以供命令行使用。

validate用法示例:

fromtableschemaimportTable# Create tabletable=Table('path.csv',schema='schema.json')# Print schema descriptorprint(table.schema.descriptor)# Print cast rows in a dict formforkeyed_rowintable.iter(keyed=True):print(keyed_row)
5

推断用法示例:

fromtableschemaimportTable# Create tabletable=Table('path.csv',schema='schema.json')# Print schema descriptorprint(table.schema.descriptor)# Print cast rows in a dict formforkeyed_rowintable.iter(keyed=True):print(keyed_row)
6

响应是一个json模式。可选参数--encoding允许为数据文件指定字符编码。默认为UTF-8。

贡献

该项目遵循开放知识国际编码标准。

建议的入门方法是创建和激活项目虚拟环境。 要将包和开发依赖项安装到活动环境中,请执行以下操作:

fromtableschemaimportTable# Create tabletable=Table('path.csv',schema='schema.json')# Print schema descriptorprint(table.schema.descriptor)# Print cast rows in a dict formforkeyed_rowintable.iter(keyed=True):print(keyed_row)
7

要使用绒布和覆盖率运行测试:

fromtableschemaimportTable# Create tabletable=Table('path.csv',schema='schema.json')# Print schema descriptorprint(table.schema.descriptor)# Print cast rows in a dict formforkeyed_rowintable.iter(keyed=True):print(keyed_row)
8

对于linting,使用在pylama.ini中配置的pylama。在这个舞台上 安装到您的环境中,可以与更细粒度的控件分开使用 如文档中所述-https://pylama.readthedocs.io/en/latest/

例如,按错误类型对结果排序:

fromtableschemaimportTable# Create tabletable=Table('path.csv',schema='schema.json')# Print schema descriptorprint(table.schema.descriptor)# Print cast rows in a dict formforkeyed_rowintable.iter(keyed=True):print(keyed_row)
9

使用tox.ini中配置的测试tox。 它已经安装到您的环境中,可以与文档中描述的更细粒度的控件一起单独使用-https://testrun.org/tox/latest/

例如,根据python 2环境检查测试子集,增加了详细程度。 --之后的所有位置参数和选项都将传递到py.test

city,location
london,"51.50,-0.11"
paris,"48.85,2.30"
rome,N/A
0

引擎盖下的tox使用pytestpytest.ini中配置的 以及模拟包。此软件包仅在TOX环境下可用。

更改日志

这里只描述了打破和最重要的变化。所有发布版本的完整变更日志和文档都可以在格式良好的提交历史记录中找到。

1.6版

  • strict模式下,如果字段构造有问题,则引发异常

1.5版

  • 允许提供自定义猜测器和解析程序到架构推断

1.4版

  • 添加了schema.update_字段方法

1.3版

  • 支持DateTime,无时间进行日期转换

1.2版

  • 支持像1.0这样的浮点数,用于整型转换

1.1版

  • 置信度参数添加到推断

1.0版

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

推荐PyPI第三方库


热门话题
java需要设置框架。可设置大小(false)以重新绘制()   java我对PDF文件感到困惑   为什么是太阳。jvm。热点。调试器。DebuggerException:无法打开二进制文件`?   设置结果为textview时出现java空指针异常   我应该使用什么同步原语在Java中实现事件驱动程序框架?   java为什么WindowClosing处理程序在退出程序之前不执行后台任务?   如何将“20170712T18:43:04.000Z”转换为安卓或java中的相对时间?   Java,获取按键的时间长度,currentTimeMillies()始终为24   maven构建的java可执行Jar找不到logback。xml   java在其外部的函数中使用for循环中的值   java如何以表格格式将不同长度的数据对齐   java Play 2.5 WebSocket连接构建   maven而非eclipse的java强制转换问题   java如何在JFreeChart中使X轴上的值水平?   构建Java Windows应用程序以访问在线MySQL数据库需要什么   java添加构造函数会出错吗?这没有道理,请帮忙,编程问题   java在一个jframe中的两个JPanel中使用两个绘制方法   java数学或逻辑问题   java如何复制Androids库存摄像头方向更改