Construct is a powerful declarative and symmetrical parser and builder for binary data.

Instead of writing imperative code to parse a piece of data, you declaratively define a data structure that describes your data. As this data structure is not code, you can use it in one direction to parse data into Pythonic objects, and in the other direction, to build objects into binary data.

The library provides both simple, atomic constructs (such as integers of various sizes), as well as composite ones which allow you form hierarchical and sequential structures of increasing complexity. Construct features bit and byte granularity, easy debugging and testing, an easy-to-extend subclass system, and lots of primitive constructs to make your work easier:

Fields: raw bytes or numerical types

Structs and Sequences: combine simpler constructs into more complex ones

Bitwise: splitting bytes into bit-grained fields

Adapters: change how data is represented

Arrays/Ranges: duplicate constructs

Meta-constructs: use the context (history) to compute the size of data

If/Switch: branch the computational path based on the context

On-demand (lazy) parsing: read and parse only the fields what you require

Please use github issues to ask general questions, make feature requests (and vote for them), report issues and bugs, and to submit PRs. Feel free to request any changes that would support your project. There is also a gitter chat but using Issues is highly recommended.

Main documentation is at readthedocs, which is substantial. Source is at github. Releases are available at pypi.

Construct should run on CPython 2.7 3.3 3.4 3.5 3.6 3.7 and PyPy 2.7 3.5 implementations. Recommended is CPython 3.6 and PyPy (any version) because they support ordered keyword arguments, and also PyPy achieves much better performance. Therefore PyPy would be most recommended.

Following modules are needed only if you want to use certain features:

Enum34 is optional if you want Enum EnumFlags to take labels from IntEnum IntFlag.

Numpy is optional, if you want to serialize arrays using Numpy protocol. Otherwise arrays can still be serialized using PrefixedArray.

Arrow is optional, if you want to use Timestamp class.

Different Python versions support different compression modules (like gzip lzma), if you want to use Compressed class.

Ruamel.yaml is optional, if you want to use KaitaiStruct (KSY) exporter.

The library is downloadable and installable from Pypi. Just use standard command-line. There are no hard dependencies, but if you would like to install all supported (not required) modules listed above, you can use the 2nd command-line form.