创建和验证 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 可能已安装为python3、py等——只需使用与启动交互式 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 的类型均为ChecksumMismatch、FileMissing、 UnexpectedFile。
因此,例如,如果您想打印无法验证的校验和,您可以这样做:
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
执照
注意:通过参与本项目,您同意按照与本项目分发相关的相同条款许可您的作品。