Skip to main content

bagit is a Python library and command line utility for working with BagIt style packages.

Installation

bagit.py is a single-file python module that you can drop into your project as needed or you can install globally with:

pip install bagit

A supported version of Python 3 is required.

Command Line Usage

When you install bagit you should get a command-line program called bagit.py which you can use to turn an existing directory into a bag:

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

Finding Bagit on your system

The bagit.py program should be available in your normal command-line window (Terminal on OS X, Command Prompt or Powershell on Windows, etc.). If you are unsure where it was installed you can also request that Python search for bagit as a Python module: simply replace bagit.py with python -m bagit:

python -m bagit --help

On some systems Python may have been installed as python3, py, etc. – simply use the same name you use to start an interactive Python shell:

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

Configuring BagIt

You can pass in key/value metadata for the bag using options like --contact-name above, which get persisted to the bag-info.txt. For a complete list of bag-info.txt properties you can use as commmand line arguments see --help.

Since calculating checksums can take a while when creating a bag, you may want to calculate them in parallel if you are on a multicore machine. You can do that with the --processes option:

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

To specify which checksum algorithm(s) to use when generating the manifest, use the –md5, –sha1, –sha256 and/or –sha512 flags (MD5 is generated by default).

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

If you would like to validate a bag you can use the –validate flag.

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

If you would like to take a quick look at the bag to see if it seems valid by just examining the structure of the bag, and comparing its payload-oxum (byte count and number of files) then use the --fast flag.

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

And finally, if you’d like to parallelize validation to take advantage of multiple CPUs you can:

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

Using BagIt in your programs

You can also use BagIt programatically in your own Python programs by importing the bagit module.

Create

To create a bag you would do this:

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

make_bag returns a Bag instance. If you have a bag already on disk and would like to create a Bag instance for it, simply call the constructor directly:

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

Update Bag Metadata

You can change the metadata persisted to the bag-info.txt by using the info property on a Bag.

# 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()

Update Bag Manifests

By default save will not update manifests. This guards against a situation where a call to save to persist bag metadata accidentally regenerates manifests for an invalid bag. If you have modified the payload of a bag by adding, modifying or deleting files in the data directory, and wish to regenerate the manifests set the manifests parameter to True when calling save.

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)

The save method takes an optional processes parameter which will determine how many processes are used to regenerate the checksums. This can be handy on multicore machines.

Validation

If you would like to see if a bag is valid, use its is_valid method:

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

If you’d like to get a detailed list of validation errors, execute the validate method and catch the BagValidationError exception. If the bag’s manifest was invalid (and it wasn’t caught by the payload oxum) the exception’s details property will contain a list of ManifestErrors that you can introspect on. Each ManifestError, will be of type ChecksumMismatch, FileMissing, UnexpectedFile.

So for example if you want to print out checksums that failed to validate you can do this:

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))

To iterate through a bag’s manifest and retrieve checksums for the payload files use the bag’s entries dictionary:

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

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

Contributing to bagit-python development

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

Running the tests

You can quickly run the tests using the built-in unittest framework:

python -m unittest discover

If you have Docker installed, you can run the tests under Linux inside a container:

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

Benchmarks

If you’d like to see how increasing parallelization of bag creation on your system effects the time to create a bag try using the included bench utility:

% ./bench.py

License

cc0

Note: By contributing to this project, you agree to license your work under the same terms as those that govern this project’s distribution.

Metadata

Release files for bagit 1.9.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for bagit 1.9.0
File Size Uploaded
bagit-1.9.0.tar.gz 23.4 kB Details

Release files / bagit-1.9.0.tar.gz

Download URL bagit-1.9.0.tar.gz
Size 23.4 kB
Tags Source
SHA-256 checksum
How to use checksums
9455006c2d1df88be95ec1fccabc5ea623389589ea4c85b3d85bd256f29d7656
BLAKE2b-256 checksum
How to use checksums
a1a08866b4c6f894af0eb10e4964157f3241dd4117700fc010e7825471d51a13
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.9

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 13, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

1.9.0 This release

1 release file

1.8.1

2 release files

1.8.0

2 release files

1.7.0

1 release file

1.6.4

1 release file

1.6.3

1 release file

1.6.2

1 release file

1.6.1

1 release file

1.6.0

2 release files

1.6.0b5

1.5.4

3 release files

1.5.2

1 release file

1.5.1

1 release file

1.5.0

1 release file

1.4.0

1 release file

1.3.7

1 release file

1.3.6

1 release file

1.3.5

1 release file

1.3.4

1 release file

1.3.3

1 release file

1.3.2

1 release file

1.3.1

1 release file

1.2.1

1 release file

1.2.0

1 release file

1.1.0

1 release file

1.0.4

1 release file

1.0.3

1 release file

1.0.2

1 release file

1.0.1

1 release file

1.0.0

1 release file

0.9.9

1 release file

0.9.8

1 release file

0.9.7

1 release file

0.9.6

1 release file

0.9.5

1 release file

0.9.4

1 release file

0.9.3

1 release file

0.9.2

1 release file

0.9.1

1 release file

0.9

1 release file

0.8

1 release file

0.7

1 release file

0.6

1 release file

0.5

1 release file

0.4

1 release file

0.3

1 release file

0.2

1 release file

0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page