创建和验证BagIt包
项目描述
bagit 是一个用于处理 BagIt 风格包的 Python 库和命令行实用程序。
安装
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外壳的相同名称
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
如果您只想快速查看袋的结构以确定它看起来是否有效,并且只需通过检查其payload-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))
要遍历袋的清单并检索有效负载文件的校验和,请使用袋的entries字典
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
许可证
注意:通过向本项目做出贡献,您同意将您的作品许可给与本项目的分发相同的条款
项目详情
下载文件
下载适合您平台文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。