根据specs.frictionlessdata.io定义的数据包的实用工具
项目描述
datapackage-py
用于处理数据包的库。
[重要通知] 我们已发布Frictionless Framework。该框架提供了改进的
datapackage
功能,扩展为完整的数据解决方案。此次更新不会破坏现有软件,因此无需采取任何操作。请阅读从datapackage
迁移到Frictionless Framework的迁移指南。
功能
Package
类用于处理数据包Resource
类用于处理数据资源Profile
类用于处理配置文件validate
函数用于验证数据包描述符infer
函数用于推断数据包描述符
内容
入门指南
安装
该包使用语义版本控制。这意味着主要版本可能包含破坏性更改。强烈建议在您的setup/requirements
文件中指定datapackage
版本范围,例如:datapackage>=1.0,<2.0
。
$ pip install datapackage
OSX 10.14+
如果您在Mac OSX 10.14(Mojave)或更高版本上安装datapackage时收到有关cchardet
包的错误,请按照以下步骤操作
- 确保您拥有最新的x-code,请在终端中运行以下命令:
xcode-select --install
- 然后转到https://developer.apple.com/download/more/并下载
命令行工具
。注意,这需要Apple ID。 - 然后,在终端中运行
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
您可以在此帖子中了解更多关于这些步骤的信息。
文档
简介
让我们从一个简单的例子开始
from datapackage import Package
package = Package('datapackage.json')
package.get_resource('resource').read()
处理数据包
一个用于处理数据包的类。它提供各种功能,例如加载本地或远程数据包、推断数据包描述符、保存数据包描述符等等。
假设我们在data
目录中有一些本地的csv文件。让我们使用Package
类根据这些数据创建一个数据包
data/cities.csv
city,location
london,"51.50,-0.11"
paris,"48.85,2.30"
rome,"41.89,12.51"
data/population.csv
city,year,population
london,2017,8780000
paris,2017,2240000
rome,2017,2860000
首先我们创建一个空数据包
package = Package()
现在我们已准备好根据我们拥有的数据文件推断数据包描述符。因为我们有两个csv文件,我们使用glob模式**/*.csv
package.infer('**/*.csv')
package.descriptor
#{ profile: 'tabular-data-package',
# resources:
# [ { path: 'data/cities.csv',
# profile: 'tabular-data-resource',
# encoding: 'utf-8',
# name: 'cities',
# format: 'csv',
# mediatype: 'text/csv',
# schema: [Object] },
# { path: 'data/population.csv',
# profile: 'tabular-data-resource',
# encoding: 'utf-8',
# name: 'population',
# format: 'csv',
# mediatype: 'text/csv',
# schema: [Object] } ] }
infer
方法已找到我们所有的文件并检查它们以提取有用的元数据,如配置文件、编码、格式、Table Schema等。让我们稍作修改
package.descriptor['resources'][1]['schema']['fields'][1]['type'] = 'year'
package.commit()
package.valid # true
因为我们的资源是表格式的,我们可以将其读取为表格数据
package.get_resource('population').read(keyed=True)
#[ { city: 'london', year: 2017, population: 8780000 },
# { city: 'paris', year: 2017, population: 2240000 },
# { city: 'rome', year: 2017, population: 2860000 } ]
让我们将我们的描述符保存到磁盘上的zip文件中
package.save('datapackage.zip')
为了继续使用数据包进行工作,我们再次加载它,但这次使用本地的datapackage.zip
package = Package('datapackage.zip')
# Continue the work
这只是一个对Package
类的简单介绍。要了解更多信息,请查看Package
类的API参考。
处理资源
一个用于处理数据资源的类。您可以使用iter/read
方法读取或迭代表格资源,并使用row_iter/row_read
方法以字节形式读取所有资源。
假设我们有一些本地的csv文件。它可以是在行内数据或远程链接 - 所有这些都由Resource
类支持(当然不包括用于浏览器内使用的本地文件)。但现在假设它是data.csv
city,location
london,"51.50,-0.11"
paris,"48.85,2.30"
rome,N/A
让我们创建并读取一个资源。因为资源是表格式的,我们可以使用具有keyed
选项的resource.read
方法来获取键行的数组
resource = Resource({path: 'data.csv'})
resource.tabular # true
resource.read(keyed=True)
# [
# {city: 'london', location: '51.50,-0.11'},
# {city: 'paris', location: '48.85,2.30'},
# {city: 'rome', location: 'N/A'},
# ]
resource.headers
# ['city', 'location']
# (reading has to be started first)
正如我们所见,我们的位置只是一个字符串。但它应该是地理点。此外,罗马的位置不可用,但也是一个N/A
字符串,而不是Python中的None
。首先,我们必须推断资源元数据。
resource.infer()
resource.descriptor
#{ path: 'data.csv',
# profile: 'tabular-data-resource',
# encoding: 'utf-8',
# name: 'data',
# format: 'csv',
# mediatype: 'text/csv',
# schema: { fields: [ [Object], [Object] ], missingValues: [ '' ] } }
resource.read(keyed=True)
# Fails with a data validation error
让我们修复不可用的位置。Table Schema规范中有一个missingValues
属性。作为第一次尝试,我们在resource.descriptor.schema
中将missingValues
设置为N/A
。资源描述符可以就地更改,但所有更改都必须通过resource.commit()
提交。
resource.descriptor['schema']['missingValues'] = 'N/A'
resource.commit()
resource.valid # False
resource.errors
# [<ValidationError: "'N/A' is not of type 'array'">]
作为好公民,我们决定检查资源描述符的有效性。它无效!我们应该使用一个数组来表示missingValues
属性。同时,别忘了有一个空字符串作为缺失值。
resource.descriptor['schema']['missingValues'] = ['', 'N/A']
resource.commit()
resource.valid # true
一切顺利。看起来我们准备再次读取我们的数据了。
resource.read(keyed=True)
# [
# {city: 'london', location: [51.50,-0.11]},
# {city: 'paris', location: [48.85,2.30]},
# {city: 'rome', location: null},
# ]
现在我们看到
- 位置是包含数字纬度和经度的数组
- 罗马的位置是原生的JavaScript
null
由于数据读取没有错误,我们可以确信我们的数据符合我们的模式。让我们保存我们的资源描述符。
resource.save('dataresource.json')
让我们检查新创建的dataresource.json
。它包含我们数据文件的路径、推断的元数据和我们的missingValues
调整。
{
"path": "data.csv",
"profile": "tabular-data-resource",
"encoding": "utf-8",
"name": "data",
"format": "csv",
"mediatype": "text/csv",
"schema": {
"fields": [
{
"name": "city",
"type": "string",
"format": "default"
},
{
"name": "location",
"type": "geopoint",
"format": "default"
}
],
"missingValues": [
"",
"N/A"
]
}
}
如果我们决定进一步改进它,我们可以更新dataresource.json
文件,然后使用本地文件名再次打开它。
resource = Resource('dataresource.json')
# Continue the work
这只是对Resource
类的基本介绍。要了解更多信息,请查看Resource
类API参考。
处理组
一个表示一组表格资源的类。组可以用来读取多个资源作为一组,或者将它们导出,例如,作为一个表导出到数据库。要定义一个组,将group: <name>
字段添加到相应的资源。组的元数据将从“领先”资源(具有组名称的第一个资源)的元数据创建。
考虑我们有一个包含两个表的数据包,这些表按年份分区,并且共享的方案存储在单独的位置。
cars-2017.csv
name,value
bmw,2017
tesla,2017
nissan,2017
cars-2018.csv
name,value
bmw,2018
tesla,2018
nissan,2018
cars.schema.json
{
"fields": [
{
"name": "name",
"type": "string"
},
{
"name": "value",
"type": "integer"
}
]
}
datapackage.json
{
"name": "datapackage",
"resources": [
{
"group": "cars",
"name": "cars-2017",
"path": "cars-2017.csv",
"profile": "tabular-data-resource",
"schema": "cars.schema.json"
},
{
"group": "cars",
"name": "cars-2018",
"path": "cars-2018.csv",
"profile": "tabular-data-resource",
"schema": "cars.schema.json"
}
]
}
让我们分别读取资源。
package = Package('datapackage.json')
package.get_resource('cars-2017').read(keyed=True) == [
{'name': 'bmw', 'value': 2017},
{'name': 'tesla', 'value': 2017},
{'name': 'nissan', 'value': 2017},
]
package.get_resource('cars-2018').read(keyed=True) == [
{'name': 'bmw', 'value': 2018},
{'name': 'tesla', 'value': 2018},
{'name': 'nissan', 'value': 2018},
]
另一方面,这些资源使用具有group: cars
字段的定义。这意味着我们可以将它们视为一组。
package = Package('datapackage.json')
package.get_group('cars').read(keyed=True) == [
{'name': 'bmw', 'value': 2017},
{'name': 'tesla', 'value': 2017},
{'name': 'nissan', 'value': 2017},
{'name': 'bmw', 'value': 2018},
{'name': 'tesla', 'value': 2018},
{'name': 'nissan', 'value': 2018},
]
当我们需要将数据包保存到存储中时,例如,保存到SQL数据库时,我们可以使用这种方法。有一个merge_groups
标志来启用分组行为。
package = Package('datapackage.json')
package.save(storage='sql', engine=engine)
# SQL tables:
# - cars-2017
# - cars-2018
package.save(storage='sql', engine=engine, merge_groups=True)
# SQL tables:
# - cars
处理配置文件
一个用于表示来自配置文件注册表的JSON Schema配置文件的组件
profile = Profile('data-package')
profile.name # data-package
profile.jsonschema # JSON Schema contents
try:
valid = profile.validate(descriptor)
except exceptions.ValidationError as exception:
for error in exception.errors:
# handle individual error
处理外键
库支持在Table Schema规范中描述的外键。这意味着如果您的数据包描述符使用某些资源的resources[].schema.foreignKeys
属性,则在读取操作中将检查数据完整性。
考虑我们有一个数据包
DESCRIPTOR = {
'resources': [
{
'name': 'teams',
'data': [
['id', 'name', 'city'],
['1', 'Arsenal', 'London'],
['2', 'Real', 'Madrid'],
['3', 'Bayern', 'Munich'],
],
'schema': {
'fields': [
{'name': 'id', 'type': 'integer'},
{'name': 'name', 'type': 'string'},
{'name': 'city', 'type': 'string'},
],
'foreignKeys': [
{
'fields': 'city',
'reference': {'resource': 'cities', 'fields': 'name'},
},
],
},
}, {
'name': 'cities',
'data': [
['name', 'country'],
['London', 'England'],
['Madrid', 'Spain'],
],
},
],
}
让我们检查teams
资源的关联。
from datapackage import Package
package = Package(DESCRIPTOR)
teams = package.get_resource('teams')
teams.check_relations()
# tableschema.exceptions.RelationError: Foreign key "['city']" violation in row "4"
正如我们所见,存在一个外键违规。这是因为我们的查找表cities
中没有Munich
这个城市,但我们有一个来自那里的团队。我们需要在cities
资源中修复它。
package.descriptor['resources'][1]['data'].append(['Munich', 'Germany'])
package.commit()
teams = package.get_resource('teams')
teams.check_relations()
# True
修复了!但不仅限于检查操作。我们可以使用relations
参数来为resource.iter/read
方法解引用资源关系
teams.read(keyed=True, relations=True)
#[{'id': 1, 'name': 'Arsenal', 'city': {'name': 'London', 'country': 'England}},
# {'id': 2, 'name': 'Real', 'city': {'name': 'Madrid', 'country': 'Spain}},
# {'id': 3, 'name': 'Bayern', 'city': {'name': 'Munich', 'country': 'Germany}}]
我们得到的不是普通的城市名称,而是一个包含城市数据的字典。这些resource.iter/read
方法如果存在完整性问题,将失败,与resource.check_relations
错误相同。但只有在传递了relations=True
标志时才会如此。
处理validate/infer
一个用于验证数据包描述符的独立函数
from datapackage import validate, exceptions
try:
valid = validate(descriptor)
except exceptions.ValidationError as exception:
for error in exception.errors:
# handle individual error
一个用于推断数据包描述符的独立函数。
descriptor = infer('**/*.csv')
#{ profile: 'tabular-data-resource',
# resources:
# [ { path: 'data/cities.csv',
# profile: 'tabular-data-resource',
# encoding: 'utf-8',
# name: 'cities',
# format: 'csv',
# mediatype: 'text/csv',
# schema: [Object] },
# { path: 'data/population.csv',
# profile: 'tabular-data-resource',
# encoding: 'utf-8',
# name: 'population',
# format: 'csv',
# mediatype: 'text/csv',
# schema: [Object] } ] }
常见问题解答
通过代理服务器访问数据?
在调用package = Package("https://xxx.json")
之前,设置以下环境变量
import os
os.environ["HTTP_PROXY"] = 'xxx'
os.environ["HTTPS_PROXY"] = 'xxx'
API参考
命令行工具
cli()
命令行界面
Usage: datapackage [OPTIONS] COMMAND [ARGS]...
Options:
--version Show the version and exit.
--help Show this message and exit.
Commands:
infer
validate
数据包
Package(self,
descriptor=None,
base_path=None,
strict=False,
unsafe=False,
storage=None,
schema=None,
default_base_path=None,
**options)
数据包表示
参数
- descriptor (str/dict):数据包描述符作为本地路径、URL或对象
- base_path (str):所有相对路径的基础路径
- strict (bool):严格标志,用于更改验证行为。将其设置为
True
将导致在具有无效描述符的任何操作上抛出错误。 - unsafe (bool):如果
True
,则允许不安全路径。有关更多信息,请参阅 https://specs.frictionlessdata.io/data-resource/#data-location。默认为False
- storage (str/tableschema.Storage):存储名称,如
sql
或存储实例。 - options (dict):用于存储创建的存储选项。
抛出异常
DataPackageException
:如果出错则抛出错误。
package.base_path
包的基本路径。
返回
str/None
:返回数据包的基本路径。
package.descriptor
包的描述符。
返回
dict
:描述符。
package.errors
验证错误。
在严格模式下始终为空。
返回
Exception[]
:验证错误。
package.profile
包的配置文件。
返回
Profile
:Profile
类的实例。
package.resource_names
包的资源名称。
返回
str[]
:返回资源名称数组。
package.resources
包的资源。
返回
Resource[]
:返回资源实例数组。
package.valid
验证状态。
在严格模式下始终为真。
返回
bool
:验证状态。
package.get_resource
package.get_resource(name)
通过名称获取数据包资源。
参数
- name (str):数据资源名称。
返回
Resource/None
:返回 Resource
实例或未找到时为 null。
package.add_resource
package.add_resource(descriptor)
将新资源添加到数据包中。
将新添加的资源描述符与数据包描述符进行验证。
参数
- descriptor (dict):数据资源描述符。
抛出异常
DataPackageException
:如果出错则抛出错误。
返回
Resource/None
:返回添加的 Resource
实例或未添加时为 null。
package.remove_resource
package.remove_resource(name)
通过名称移除数据包资源。
移除资源描述符后,将对数据包描述符进行验证。
参数
- name (str):数据资源名称。
抛出异常
DataPackageException
:如果出错则抛出错误。
返回
Resource/None
:返回移除的资源实例或未找到时为 null。
package.get_group
package.get_group(name)
通过名称返回一组表格资源。
有关组的信息,请参阅 组。
参数
- name (str):资源组的名称。
抛出异常
DataPackageException
:如果出错则抛出错误。
返回
Group/None
:返回 Group
实例或未找到时为 null。
package.infer
package.infer(pattern=False)
推断数据包元数据。
参数
pattern
仅适用于本地文件。
如果未提供 pattern
,则仅推断现有资源(添加元数据如编码、配置文件等)。如果提供了 pattern
,则将添加与模式匹配的新资源并推断它们。它将对数据包实例进行更改提交。
参数
- pattern (str):新资源的 glob 模式。
返回
dict
:返回数据包描述符。
package.commit
package.commit(strict=None)
如果描述符中有就地更改,则更新数据包实例。
示例
package = Package({
'name': 'package',
'resources': [{'name': 'resource', 'data': ['data']}]
})
package.name # package
package.descriptor['name'] = 'renamed-package'
package.name # package
package.commit()
package.name # renamed-package
参数
- strict (bool):更改
strict
模式以进行进一步工作
抛出异常
DataPackageException
:如果出错则抛出错误。
返回
bool
:成功时返回 true,未修改时返回 false。
package.save
package.save(target=None,
storage=None,
merge_groups=False,
to_base_path=False,
**options)
保存此数据包。
如果传递了 storage
参数,则将其保存到存储中;如果 target
参数以 .json
结尾,则将其描述符保存到 json 文件中;否则,将其保存到 zip 文件中。
示例
它将创建一个包含此数据包及其资源的 zip 文件到 file_or_path
。所有内容位于本地文件系统中的资源都将复制到 zip 文件中。考虑以下数据包描述符
{
"name": "gdp",
"resources": [
{"name": "local", "format": "CSV", "path": "data.csv"},
{"name": "inline", "data": [4, 8, 15, 16, 23, 42]},
{"name": "remote", "url": "http://someplace.com/data.csv"}
]
}
zip 文件的最终结构将是
./datapackage.json
./data/local.csv
《datapackage.json》的内容与返回的《datapackage.descriptor》相同。如果存在,资源文件的名称根据其《name》和《format》字段生成。如果资源没有《name》,则使用《resource-X》,其中《X》是资源在《resources》列表中的索引(从零开始)。如果资源有《format》,则将其转换为小写并附加到《name》后面,成为“《name.format》”。
参数
- target (字符串/类似文件对象):将此数据包的内容保存到该文件路径或类似文件对象。
- storage (str/tableschema.Storage):存储名称,如
sql
或存储实例。 - merge_groups (布尔值):如果提供存储(例如,一个SQL表),则将所有组的表格资源保存到一个存储桶中。更多信息请参阅组。
- to_base_path (布尔值):使用“<base_path>/<target>”路由将包保存到包的基本路径。
- options (dict):用于存储创建的存储选项。
抛出异常
DataPackageException
:如果在写入包时出现错误,则引发。
返回
bool/Storage
:在成功的情况下返回true或一个《Storage》实例。
资源
Resource(self,
descriptor={},
base_path=None,
strict=False,
unsafe=False,
storage=None,
package=None,
**options)
资源表示
参数
- descriptor (字符串/字典):数据资源描述符,作为本地路径、URL或对象。
- base_path (str):所有相对路径的基础路径
- strict (布尔值):严格标志,用于修改验证行为。将其设置为《true》会导致在操作无效描述符时抛出错误。
- unsafe (bool):如果
True
,则允许不安全路径。有关更多信息,请参阅 https://specs.frictionlessdata.io/data-resource/#data-location。默认为False
- storage (str/tableschema.Storage):存储名称,如
sql
或存储实例。 - options (dict):用于存储创建的存储选项。
抛出异常
DataPackageException
:如果出错则抛出错误。
resource.data
返回资源数据
resource.descriptor
包的描述符。
返回
dict
:描述符。
resource.errors
验证错误。
在严格模式下始终为空。
返回
Exception[]
:验证错误。
resource.group
组名称
返回
str
:组名称
resource.headers
资源头
仅适用于表格资源(必须先开始读取,否则为《None》)
返回
str[]/None
:返回数据源头
resource.inline
资源是否内联
返回
bool
:如果资源是内联的,则返回true
resource.local
资源是否本地
返回
bool
:如果资源是本地的,则返回true
resource.multipart
资源是否多部分
返回
bool
:如果资源是多部分的,则返回true
resource.name
资源名称
返回
str
:名称
resource.package
如果资源属于某个包,则返回包实例
返回
Package/None
:如果可用,则返回包实例
resource.profile
资源配置文件
返回
Profile
:Profile
类的实例。
resource.remote
资源是否远程
返回
bool
:如果资源是远程的,则返回true
resource.schema
资源模式
仅适用于表格资源
对于表格资源,它返回一个可以与数据模式交互的《Schema》实例。阅读API文档 - tableschema.Schema。
返回
tableschema.Schema
:模式
resource.source
资源的源
《resource.source》和《resource.inline/local/remote/multipart》的组合提供了与资源数据交互的预测性接口。
返回
list/str
:返回《data》或《path》属性
resource.table
返回资源表
resource.tabular
资源是否为表格
返回
bool
:如果资源是表格的,则返回true
resource.valid
验证状态。
在严格模式下始终为真。
返回
bool
:验证状态。
resource.iter
resource.iter(integrity=False, relations=False, **options)
遍历资源数据并发出基于表模式的行。
仅适用于表格资源
参数
keyed (bool):
yield keyed rows in a form of `{header1: value1, header2: value2}`
(default is false; the form of rows is `[value1, value2]`)
extended (bool):
yield extended rows in a for of `[rowNumber, [header1, header2], [value1, value2]]`
(default is false; the form of rows is `[value1, value2]`)
cast (bool):
disable data casting if false
(default is true)
integrity (bool):
if true actual size in BYTES and SHA256 hash of the file
will be checked against `descriptor.bytes` and `descriptor.hash`
(other hashing algorithms are not supported and will be skipped silently)
relations (bool):
if true foreign key fields will be checked and resolved to its references
foreign_keys_values (dict):
three-level dictionary of foreign key references optimized
to speed up validation process in a form of
`{resource1: {(fk_field1, fk_field2): {(value1, value2): {one_keyedrow}, ... }}}`.
If not provided but relations is true, it will be created
before the validation process by *index_foreign_keys_values* method
exc_handler (func):
optional custom exception handler callable.
Can be used to defer raising errors (i.e. "fail late"), e.g.
for data validation purposes. Must support the signature below
自定义异常处理程序
def exc_handler(exc, row_number=None, row_data=None, error_data=None):
'''Custom exception handler (example)
# Arguments:
exc(Exception):
Deferred exception instance
row_number(int):
Data row number that triggers exception exc
row_data(OrderedDict):
Invalid data row source data
error_data(OrderedDict):
Data row source data field subset responsible for the error, if
applicable (e.g. invalid primary or foreign key fields). May be
identical to row_data.
'''
# ...
抛出异常
DataPackageException
:任何错误的基类CastError
:数据转换错误IntegrityError
:完整性检查错误UniqueKeyError
:违反唯一键约束UnresolvedFKError
:未解决的引用键错误
返回
Iterator[list]
:产生行
resource.read
resource.read(integrity=False,
relations=False,
foreign_keys_values=False,
**options)
读取整个资源,并作为行数组的返回
仅适用于表格资源 它与《resource.iter》具有相同的API,除了
参数
- limit (整数):限制要读取和返回的行数
返回
list[]
:返回行
resource.check_integrity
resource.check_integrity()
检查资源完整性
仅适用于表格资源
它检查文件大小(以字节为单位)和SHA256哈希与《descriptor.bytes》和《descriptor.hash》的文件大小和哈希值进行比较(不支持其他哈希算法,将静默跳过)。
抛出异常
exceptions.IntegrityError
:如果有完整性问题,则引发
返回
bool
:如果没有问题则返回 True
resource.check_relations
resource.check_relations(foreign_keys_values=False)
检查关系
仅适用于表格资源
它检查外键,如果存在完整性问题,则引发异常。
抛出异常
exceptions.RelationError
:如果有关系问题则引发
返回
bool
:如果没有问题则返回 True
resource.drop_relations
resource.drop_relations()
删除关系
仅适用于表格资源
从内存中删除关系数据
返回
bool
:返回 True
resource.raw_iter
resource.raw_iter(stream=False)
以字节形式迭代数据块。
如果 stream
为 true,将返回类似文件的对象。
参数
- stream (bool):返回类似文件的对象
返回
bytes[]/filelike
:返回 bytes[]/filelike
resource.raw_read
resource.raw_read()
以字节形式返回资源数据。
返回
bytes
:以字节形式返回资源数据
resource.infer
resource.infer(**options)
推断资源元数据
如名称、格式、媒体类型、编码、模式和配置文件。它将此更改提交到资源实例。
参数
- options:选项将传递给
tableschema.infer
调用,以便对结果进行更多控制(例如,设置limit
、confidence
等)。
返回
dict
:返回资源描述符
resource.commit
resource.commit(strict=None)
如果描述符中有原地更改,则更新资源实例。
参数
- strict (bool):更改
strict
模式以进行进一步工作
抛出异常
DataPackageException
:如果出错则抛出错误。
返回
bool
:成功时返回 true,未修改时返回 false。
resource.save
resource.save(target, storage=None, to_base_path=False, **options)
保存此资源
如果传递了 storage
参数,则将其保存到存储中;否则,将资源描述符保存到 json 文件中。
参数
- target (str):保存资源的路径
- storage (str/tableschema.Storage):存储名称,如
sql
或存储实例。 - to_base_path (bool):使用 "<base_path>/<target>" 路径将资源保存到资源的基路径
- options (dict):用于存储创建的存储选项。
抛出异常
DataPackageException
:如果出错则抛出错误。
返回
bool
:在成功时返回 true 构建索引... 开始生成文档...
组
Group(self, resources)
分组表示
参数
- Resource[]:TABULAR 资源列表
group.headers
分组的标题
返回
str[]/None
:返回标题
group.name
组名称
返回
str
:名称
group.schema
资源模式
返回
tableschema.Schema
:模式
group.iter
group.iter(**options)
遍历组数据,并根据表模式发出行。
它连接所有资源,并具有与
resource.iter
相同的 API。
group.read
group.read(limit=None, **options)
读取整个组并作为行数组返回
它连接所有资源,并具有与
resource.read
相同的 API。
group.check_relations
group.check_relations()
检查组的关联
与 resource.check_relations
相同,但没有可选参数 foreign_keys_values。此方法将一次性在测试资源集之前创建 foreign_key_values 哈希表,从而通过一次创建 foreignKeys 的整个组的键值对来优化过程。
配置文件
Profile(self, profile)
配置文件表示
参数
- profile (str):注册表中的配置文件名称或 JSON Schema 的 URL
抛出异常
DataPackageException
:如果出错则抛出错误。
profile.jsonschema
JSONSchema 内容
返回
dict
:返回配置文件的 JSON Schema 内容
profile.name
配置文件名称
返回
str/None
:如果可用则返回名称
profile.validate
profile.validate(descriptor)
将数据包 descriptor
与配置文件进行验证。
参数
- descriptor (dict):检索和取消引用的数据包描述符
抛出异常
ValidationError
:如果无效则引发 返回
bool
:如果有效则返回 True
validate
validate(descriptor)
验证数据包描述符。
参数
- descriptor (str/dict):包描述符(以下之一):- 本地路径 - 远程 URL - 对象
抛出异常
ValidationError
:无效时引发
返回
bool
:如果有效则返回 true
infer
infer(pattern, base_path=None)
推断数据包描述符。
参数
pattern
仅适用于本地文件。
参数
- pattern (str):glob 文件模式
返回
dict
:返回数据包描述符。
DataPackageException
DataPackageException(self, message, errors=[])
所有 DataPackage/TableSchema 异常的基类。
如果有多个错误,可以从异常对象中读取它们
try:
# lib action
except DataPackageException as exception:
if exception.multiple:
for error in exception.errors:
# handle error
datapackageexception.errors
嵌套错误列表
返回
DataPackageException[]
:嵌套错误列表
datapackageexception.multiple
是否是嵌套异常
返回
bool
:是否是嵌套异常
TableSchemaException
TableSchemaException(self, message, errors=[])
所有 TableSchema 异常的基类。
LoadError
LoadError(self, message, errors=[])
所有加载错误。
CastError
CastError(self, message, errors=[])
所有值转换错误。
IntegrityError
IntegrityError(self, message, errors=[])
所有完整性错误。
RelationError
RelationError(self, message, errors=[])
所有关系错误。
StorageError
StorageError(self, message, errors=[])
所有存储错误。
贡献
本项目遵循开放知识国际编码标准。
开始推荐的步骤是创建和激活一个项目虚拟环境。要将软件包和开发依赖项安装到活动环境中
$ make install
以运行带有代码检查和覆盖率测试
$ make test
变更日志
以下仅描述了破坏性和最重要的更改。所有发布版本的完整变更日志和文档可以在格式良好的提交历史中找到。
v1.15
警告:它可能对某些设置造成破坏,请阅读以下讨论
- 根据规范修复了标题管理
v1.14
- 添加了选择/跳过字段/行的实验性选项
v1.13
- 向Package和Resource添加了
unsafe
选项(#262)
v1.12
- 默认使用
chardet
进行编码检测。对于cchardet
:pip install datapackage[cchardet]
v1.11
resource/package.save
现在接受一个to_base_path
参数(#254)package.save
现在如果可用,返回一个Storage
实例
v1.10
- 添加了检查表格资源完整性的功能
v1.9
- 添加了
resource.package
属性
v1.8
- 添加了对资源组的支持
v1.7
- 添加了对资源压缩的支持
v1.6
- 添加了对自定义请求会话的支持
v1.5
更新了行为
- 添加了对Python 3.7的支持
v1.4
添加了新的API
- 向资源描述符添加了对
skip_rows
的支持
v1.3
添加了新的API
- 属性
package.base_path
现在公开可用
v1.2
更新了行为
- CLI命令
$ datapackage infer
现在只输出JSON格式的数据包描述符。
v1.1
添加了新的API
- 添加了
Package/Resource
和tableschema.Storage
之间的集成 - https://github.com/frictionlessdata/tableschema-py#storage。它允许从/到不同的存储(如SQL/BigQuery等)加载和保存数据包。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。