Classes for representing different file formats in Python classes for use in type hinting in data workflows
Project description
Fileformats provides a library of file-format types implemented as Python classes. The file-format types are designed to be used in type validation during the construction of data workflows (e.g. Pydra, Fastr), and also provide some basic data handling methods (e.g. loading data to dictionaries) and conversions between some equivalent types When the “extended” install option is provided.
File-format types are typically identified by a combination of file extension and “magic numbers” where applicable, however, unlike many other file-type Python packages, FileFormats, supports multi-file data formats (“file sets”) often found in scientific workflows, e.g. with separate header/data files. FileFormats also provides a flexible framework to add custom identification routines for exotic file formats, e.g. formats that require inspection of headers to locate data files, directories containing certain file types, or to peek at metadata fields to define specific sub-types (e.g. functional MRI DICOM file set).
See the extension template for instructions on how to design FileFormats extensions modules to augment the standard file-types implemented in the main repository with custom domain/vendor-specific file-format types. Note that FileFormats is a new package, and only has limited support for standard formats at this stage, although the aim is to include all the official IANA MIME types (hopefully by scraping that site if anyone wants to have a go 😊).
Installation
FileFormats can be installed for Python >= 3.7 from PyPI with
$ python3 -m pip fileformats
Support for converter methods between a few select formats can be installed by passing the ‘extended’ install extra, e.g
$ python3 -m pip install fileformats[extended]
Examples
Using the WithMagicNumber mixin class, the Png format can be defined concisely as
from fileformats.generic import File
from fileformats.core.mixin import WithMagicNumber
class Png(WithMagicNumber, File):
binary = True
ext = ".png"
iana_mime = "image/png"
magic_number = b".PNG"
Files can then be checked to see whether they are of PNG format by
png = Png("/path/to/image/file.png") # Checks the extension and magic number
which will raise a FormatMismatchError if initialisation or validation fails, or for a boolean method that checks the validation use matches
if Png.matches(a_path_to_a_file):
... handle case ...
There are a few selected converters between standard file-format types, perhaps most usefully between archive types and generic file/directories
from fileformats.archive import Zip
from fileformats.generic import Directory
zip_file = Zip.convert(Directory("/path/to/a/directory"))
extracted = Directory.convert(zip_file)
copied = extracted.copy_to("/path/to/output")
The converters are implemented in the Pydra dataflow framework, and can be linked into wider Pydra workflows by creating a converter task
import pydra
from pydra.tasks.mypackage import MyTask
from fileformats.serialization import Json, Yaml
wf = pydra.Workflow(name="a_workflow", input_spec=["in_json"])
wf.add(
Yaml.get_converter(Json, name="json2yaml", in_file=wf.lzin.in_json)
)
wf.add(
MyTask(
name="my_task",
in_file=wf.json2yaml.lzout.out_file,
)
)
...
Alternatively, the conversion can be executed outside of a Pydra workflow with
json_file = Json("/path/to/file.json")
yaml_file = Yaml.convert(json_file)
License
This work is licensed under a Creative Commons Attribution 4.0 International License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file fileformats-0.8.0.tar.gz
.
File metadata
- Download URL: fileformats-0.8.0.tar.gz
- Upload date:
- Size: 78.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f7fbfa31f86b4b67db3435c784ff2a32fe0a2fcfd398cc0386b6cd9cb4eba130 |
|
MD5 | 30046250f0bd5289bf46fc80f028788b |
|
BLAKE2b-256 | e9ae44c1a771607b1d96833678cad4c06d53e0c653e01709930170bb763f299d |
File details
Details for the file fileformats-0.8.0-py3-none-any.whl
.
File metadata
- Download URL: fileformats-0.8.0-py3-none-any.whl
- Upload date:
- Size: 98.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1778c6120c0be73291f083c7586ab7152f7c75f58b253781542a03bb83d1d11a |
|
MD5 | 7d3ed57de252b5534e1420aa7c76bcc9 |
|
BLAKE2b-256 | 02856b20b2df1552a7f38e475cd969c2b05da82984230a090b7ca63af43627d2 |