☄️ Python's nested data operator (and CLI), for all your declarative restructuring needs. Got data? Glom it! ☄️
glom
Restructuring data, the Python way

Real applications have real data, and real data nests. Objects inside of objects inside of lists of objects.
glom is a powerful way to handle real-world data, featuring:
- Path-based access for nested data structures
- Readable, meaningful error messages
- Declarative data transformation, using lightweight, Pythonic specifications
- Built-in data exploration and debugging features
pip install glom
And when you install glom, you also get [the glom command-line interface][cli_rtd], letting you experiment at the console, but never limiting you to shell scripts:
Usage: glom [FLAGS] [spec [target]]
Command-line interface to the glom library, providing nested data access and data restructuring with the power of Python.
Flags:
--help / -h show this help message and exit --target-file TARGET_FILE path to target data source (optional) --target-format TARGET_FORMAT format of the source data (json, python, toml, or yaml) (defaults to 'json') --spec-file SPEC_FILE path to glom spec definition (optional) --spec-format SPEC_FORMAT format of the glom spec definition (json, python, python-full) (defaults to 'python') --indent INDENT number of spaces to indent the result, 0 to disable pretty-printing (defaults to 2) --debug interactively debug any errors that come up --inspect interactively explore the data
Anything you can do at the command line readily translates to Python code, so you've always got a path forward when complexity starts to ramp up.
Examples
Without glom
>>> data = {'a': {'b': {'c': 'd'}}}
>>> data['a']['b']['c']
'd'
>>> data2 = {'a': {'b': None}}
>>> data2['a']['b']['c']
Traceback (most recent call last):
...
TypeError: 'NoneType' object is not subscriptable
With glom
>>> glom(data, 'a.b.c')
'd'
>>> glom(data2, 'a.b.c')
Traceback (most recent call last):
...
PathAccessError: could not access 'c', index 2 in path Path('a', 'b', 'c'), got error: ...
Learn more

If all this seems interesting, continue exploring glom below:
- [glom Tutorial][tutorial]
- [Full API documentation at Read the Docs][rtd]
- [Original announcement blog post (2018-05-09)][glom_announce]
- [Frequently Asked Questions][faq]
- [PyCon 2018 Lightning Talk (2018-05-11)][pycon_talk]
- [Try glom in your browser (glompad)][glompad]
[rtd]: https://glom.readthedocs.io [cli_rtd]: https://glom.readthedocs.io/en/latest/cli.html [tutorial]: https://glom.readthedocs.io/en/latest/tutorial.html [faq]: https://glom.readthedocs.io/en/latest/faq.html [glomannounce]: https://sedimental.org/glomrestructured_data.html [gh_issues]: https://github.com/mahmoud/glom/issues/ [pycon_talk]: https://www.youtube.com/watch?v=bTAFl8P2DkE&t=18m07s [glompad]: https://yak.party/glompad/
In the meantime, just remember: When you've got nested data, glom it! ☄️