跳转到主要内容

根据specs.frictionlessdata.io定义的数据包的实用工具

项目描述

datapackage-py

Build Coverage Release Codebase Support

用于处理数据包的库。

[重要通知] 我们已发布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包的错误,请按照以下步骤操作

  1. 确保您拥有最新的x-code,请在终端中运行以下命令:xcode-select --install
  2. 然后转到https://developer.apple.com/download/more/并下载命令行工具。注意,这需要Apple ID。
  3. 然后,在终端中运行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

包的配置文件。

返回

ProfileProfile 类的实例。

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

资源配置文件

返回

ProfileProfile 类的实例。

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 调用,以便对结果进行更多控制(例如,设置 limitconfidence 等)。

返回

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进行编码检测。对于cchardetpip 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

项目详情


发布历史 发布通知 | RSS源

下载文件

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

源分布

datapackage-1.15.4.tar.gz (98.1 kB 查看散列值)

上传时间:

构建分布

datapackage-1.15.4-py2.py3-none-any.whl (85.7 kB 查看散列值)

上传时间: Python 2 Python 3

支持者