Skip to main content

FileFormats

CI/CD Codecov Static Badge Python Versions Latest Version Documentation Status

Logo Small

Fileformats provides a library of file-format types implemented as Python classes for validation, detection, typing and provide hooks for extra functionality and format conversions. Formats are typically validated/identified by a combination of file extension and "magic numbers" where applicable. Unlike other file-type packages, FileFormats, supports multi-file data formats ("file sets"), which are often found in scientific workflows, e.g. with separate header/data files.

FileFormats provides a flexible extension 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). These file-sets with auxiliary files can be moved, copied and hashed like they are a single file object.

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 (e.g. fileformats-medimage).

Notes on MIME-type coverage

Support for all non-vendor standard MIME types (i.e. ones not matching */vnd.* or */x-*) has been added to FileFormats by semi-automatically scraping the IANA MIME types website for file extensions and magic numbers. As such, many of the formats in the library have not been properly tested on real data and so should be treated with some caution. If you encounter any issues with an implemented file type, please raise an issue in the GitHub tracker.

A small selection of vendor-specific types can be found under fileformats.vendor.*. Support for additional vendor-specific formats can be added via plugin (see the extension template).

Installation

FileFormats can be installed for Python >= 3.8 from PyPI with

    python3 -m pip fileformats

Implementations of methods and converters between select formats that require external dependencies require the installation of the corresponding "extras" package e.g

    python3 -m pip install fileformats-extras

Extension packages exist for for formats not covered by [IANA MIME types] (e.g. NIfTI, R-files, MATLAB files) and can be installed along with their "extras" package similarly

    $ python3 -m pip install \
      fileformats-medimage \
      fileformats-medimage-extras \
      fileformats-datascience \
      fileformats-datascience-extras

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

Format Identification

There are 2 main functions that can be used for format identification

  • fileformats.core.from_mime
  • fileformats.core.find_matching

from_mime

As the name suggests, this function is used to return the FileFormats class corresponding to a given MIME <https://www.iana.org/assignments/media-types/media-types.xhtml>__ string. All non-vendor official MIME-types are supported. Non-official types can be loaded using the application/x-name-of-type form as long as the name of the type is unique amongst all installed format types. To avoid name clashes between different extension types, the "MIME-like" string can be used instead, where informal registries corresponding to the fileformats extension namespace are used instead, e.g. medimage/nifti-gz or datascience/hdf5.

find_matching

Given a set of file-system paths, by default, find_matching will iterate through all installed fileformats classes and return all that validate successfully (formats without any specific constraints are excluded by default). The potential candidate classes can be restricted by using the candidates keyword argument.

Format Conversion

While not implemented in the main File-formats itself, file-formats provides hooks for other packages to implement extra behaviour such as format conversion. The fileformats-extras <https://github.com/python-fileformats/fileformats-extras>__ implements a number of converters between standard file-format types, e.g. archive types to/from generic file/directories, which if installed can be called using the convert() method.

    from fileformats.application 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.application 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

CC0

Acknowledgements

The authors acknowledge the facilities and scientific and technical assistance of the National Imaging Facility, a National Collaborative Research Infrastructure Strategy (NCRIS) capability.

Release files for fileformats 0.19.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 fileformats 0.19.0
File Size Uploaded
fileformats-0.19.0.tar.gz 109.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for fileformats 0.19.0
File Interpreter ABI Platform
fileformats-0.19.0-py3-none-any.whl Python 3 none any Details

Total release size: 248.3 kB

Release files / fileformats-0.19.0.tar.gz

Download URL fileformats-0.19.0.tar.gz
Size 109.5 kB
Tags Source
SHA-256 checksum
How to use checksums
f0270328752389024e22ac21a408f70f69e8b190720b16bc04c23b6e2acc42bd
BLAKE2b-256 checksum
How to use checksums
5ad2e32121abdd8f2a87a0e80c67e25ff48085d2c313076e7ffcc7ef6b57bdf2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / fileformats-0.19.0-py3-none-any.whl

Download URL fileformats-0.19.0-py3-none-any.whl
Size 138.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7e8495cf589002937bfe7a31b793ee9cafa8c32fb75b82007eb901f5d281c136
BLAKE2b-256 checksum
How to use checksums
94463c476ec39efd4923b6584c58083e2f1942429863d2156631ac51ac5269c8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

This release

0.19.0 This release

2 release files

0.18.3

2 release files

0.18.0

2 release files

0.17.9

2 release files

0.17.8

2 release files

0.17.7

2 release files

0.17.5

2 release files

0.17.4

2 release files

0.17.3

2 release files

0.17.0

2 release files

0.16.5

2 release files

0.16.4

2 release files

0.16.3

2 release files

0.16.2

2 release files

0.16.1

2 release files

0.15.6

2 release files

0.15.5

2 release files

0.15.3

2 release files

0.15.2

2 release files

0.15.1

2 release files

0.14.4

2 release files

0.14.3

2 release files

0.14.2

2 release files

0.14.1

2 release files

0.14.0

2 release files

0.13.0

2 release files

0.12.2

2 release files

0.11.3

2 release files

0.10.9

2 release files

0.10.8

2 release files

0.10.1

2 release files

0.10.0

2 release files

0.9.5

2 release files

0.9.4

2 release files

0.9.3

2 release files

0.9.2

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.6

2 release files

0.8.5

2 release files

0.8.4

2 release files

0.8.3

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.6

2 release files

0.6.5

2 release files

0.6.4

2 release files

0.6.3

2 release files

0.6.2

2 release files

0.6.1

2 release files

0.6

2 release files

0.5.2

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.1

2 release files

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