Skip to main content

创建和验证 BagIt 包

项目描述

构建状态 覆盖状态

bagit 是一个 Python 库和命令行实用程序,用于处理 BagIt样式的包。

安装

bagit.py 是一个单文件 python 模块,您可以根据需要将其放入项目中,也可以使用以下命令全局安装:

pip install bagit

需要 Python v2.7+。

命令行用法

当你安装 bagit 时,你应该得到一个名为 bagit.py 的命令行程序,你可以使用它来将现有目录变成一个包:

bagit.py --contact-name 'John Kunze' /directory/to/bag

在您的系统上查找 Bagit

bagit.py程序应该在您的普通命令行窗口中可用(OS X 上的终端、Windows 上的命令提示符或 Powershell 等)如果您不确定它的安装位置,您还可以请求 Python 搜索bagit作为 Python 模块:只需将 bagit.py替换为python -m bagit

python -m bagit --help

在某些系统上,Python 可能已安装为python3py等——只需使用与启动交互式 Python shell 相同的名称即可:

py -m bagit --help
python3 -m bagit --help

配置 BagIt

您可以使用上面的 --contact-name之类的选项传递包的键/值元数据,这些选项 会持久保存到 bag-info.txt。有关 bag-info.txt 属性的完整列表,您可以将其用作命令行参数,请参见--help

由于在创建包时计算校验和可能需要一段时间,如果您在多核机器上,您可能希望并行计算它们。您可以使用--processes选项来做到这一点:

bagit.py --processes 4 /directory/to/bag

要指定生成清单时使用的校验和算法,请使用 –md5、–sha1、–sha256 和/或 –sha512 标志(默认生成 MD5)。

bagit.py --sha1 /path/to/bag
bagit.py --sha256 /path/to/bag
bagit.py --sha512 /path/to/bag

如果你想验证一个包,你可以使用 --validate 标志。

bagit.py --validate /path/to/bag

如果您想通过检查包的结构并比较其有效负载-oxum(字节数和文件数)来快速查看包以查看它是否有效,请使用--fast 标志。

bagit.py --validate --fast /path/to/bag

最后,如果您想并行化验证以利用多个 CPU,您可以:

bagit.py --validate --processes 4 /path/to/bag

在你的程序中使用 BagIt

您还可以通过导入bagit模块在您自己的 Python 程序中以编程方式使用 BagIt。

创造

要创建一个包,您可以这样做:

bag = bagit.make_bag('mydir', {'Contact-Name': 'John Kunze'})

make_bag返回一个 Bag 实例。如果你已经有一个包在磁盘上并且想为它创建一个 Bag 实例,只需直接调用构造函数:

bag = bagit.Bag('/path/to/bag')

更新包元数据

您可以使用Bag上的info属性更改持久保存到 bag-info.txt 的元数据 。

# load the bag
bag = bagit.Bag('/path/to/bag')

# update bag info metadata
bag.info['Internal-Sender-Description'] = 'Updated on 2014-06-28.'
bag.info['Authors'] = ['John Kunze', 'Andy Boyko']
bag.save()

更新包清单

默认情况下save不会更新清单。这可以防止调用save以持久保存包元数据的情况意外地为无效包重新生成清单。如果您通过添加、修改或删除数据目录中的文件来修改包的有效负载,并希望重新生成清单 ,请在调用save时将manifests参数设置为 True 。

import shutil, os

# add a file
shutil.copyfile('newfile', '/path/to/bag/data/newfile')

# remove a file
os.remove('/path/to/bag/data/file')

# persist changes
bag.save(manifests=True)

save 方法采用一个可选的 processes 参数,该参数将确定使用多少进程来重新生成校验和。这在多核机器上很方便。

验证

如果您想查看一个包是否有效,请使用它的is_valid方法:

bag = bagit.Bag('/path/to/bag')
if bag.is_valid():
    print("yay :)")
else:
    print("boo :(")

如果您想获取验证错误的详细列表,请执行 validate方法并捕获BagValidationError异常。如果包的清单无效(并且它没有被有效负载 oxum 捕获),则异常的details属性将包含一个 ManifestError列表,您可以对其进行自省。每个 ManifestError 的类型均为ChecksumMismatchFileMissingUnexpectedFile

因此,例如,如果您想打印无法验证的校验和,您可以这样做:

bag = bagit.Bag("/path/to/bag")

try:
  bag.validate()

except bagit.BagValidationError as e:
    for d in e.details:
        if isinstance(d, bagit.ChecksumMismatch):
            print("expected %s to have %s checksum of %s but found %s" %
                  (d.path, d.algorithm, d.expected, d.found))

要遍历包的清单并检索有效负载文件的校验和,请使用包的条目字典:

bag = bagit.Bag("/path/to/bag")

for path, fixity in bag.entries.items():
  print("path:%s md5:%s" % (path, fixity["md5"]))

为 bagit-python 开发做贡献

% git clone git://github.com/LibraryOfCongress/bagit-python.git
% cd bagit-python
# MAKE CHANGES
% python test.py

运行测试

您可以通过 setuptools 安装依赖项来快速运行测试:

python setup.py test

一旦您的代码正常工作,您就可以使用 Tox对已安装在本地系统上的每个受支持的 Python 版本运行测试:

tox

如果您安装了 Docker,您可以在容器内的 Linux 下运行测试:

% docker build -t bagit:latest . && docker run -it bagit:latest

基准

如果您想了解系统上增加的包创建并行化如何影响创建包的时间,请尝试使用包含的 bench 实用程序:

% ./bench.py

执照

cc0

注意:通过参与本项目,您同意按照与本项目分发相关的相同条款许可您的作品。