mzmlpy is a Python library for reading mzML mass spectrometry files. It's built for people writing proteomics or metabolomics pipelines who need a reader that's fast on large files, tells them exactly what's wrong with a malformed file, and doesn't force a full decode just to look at a spectrum's metadata.
Why mzmlpy?
- Lazy by design — metadata is parsed up front; binary m/z and intensity arrays are only decoded when you actually touch them.
- Fast — 5–9x faster than pymzml on complex files in our benchmarks (see below).
- Type-safe — dataclass-based models with full type annotations, not loosely-typed XML trees.
- Handles gzip well — reads
.mzML.gzdirectly, with a self-indexed gzip format for random access without re-extracting the file. - Common compressions — zlib out of the box; zstd and MS-Numpress through optional extras.
- Validates, not just parses — a
validate()function reports structural and decoding problems instead of silently producing bad data.
Install
pip install mzmlpy
Optional extras:
pip install mzmlpy[numpress] # MS-Numpress decoding
pip install mzmlpy[zstd] # Zstandard compression
pip install mzmlpy[rapidgzip] # Parallel gzip decompression (recommended for .gz files)
pip install mzmlpy[mcp] # MCP server for AI coding assistants
Quick example
from mzmlpy import Mzml
with Mzml("path/to/file.mzML") as reader:
print(f"File: {reader.file_name} | Spectra: {len(reader.spectra)}")
for spectrum in reader.spectra:
mz = spectrum.mz
intensity = spectrum.intensity
print(f" {spectrum.id} MS{spectrum.ms_level} — {len(mz)} peaks")
Both .mzML and .mzML.gz files are supported. Metadata is parsed eagerly; binary data
is decoded on demand.
What else it can do
from mzmlpy import Mzml, validate
# Structural/decoding validation, no repair attempted
report = validate("data.mzML", decode_binary=True)
print(report.valid, report.issues)
# Filter by metadata without decoding any arrays
with Mzml("data.mzML", in_memory=False) as reader:
for spectrum in reader.spectra.filter(ms_level=2, retention_time=(60, 180)):
print(spectrum.id)
Gzipped files get the same lazy, indexable access as plain mzML — gzip_mode picks
between an embedded index, an extracted cache, or streaming, and self-indexed files
(via write_indexed_gzip) support random access with no extraction step at all. Ion
mobility data (e.g. Bruker timsTOF PASEF) is exposed on the spectrum whether it's stored
as a binary array or a scan-level parameter.
| Feature | Notes |
|---|---|
.mzML / .mzML.gz |
Transparent gzip handling, including self-indexed files |
| Validation | validate() reports issues without altering the file |
| Filtering | By MS level, retention time, and precursor, without decoding arrays |
| Ion mobility | Detects both array-based and scan-level IM data |
| MCP server | pip install mzmlpy[mcp] — file discovery, metadata, and bounded array access for AI clients |
| CLI | python -m mzmlpy for validation and inspection from the shell |
See the Getting Started guide and API Reference for the full picture, including gzip mode details, the CLI, and the MCP server.
Using an AI coding assistant? Point it at
llms.txt, a short index of the
package and its docs, or at
llms-full.txt for the full API
guide with signatures and examples.
In the tacular-omics family
mzmlpy reads mzML; tdfpy reads the Bruker
timsTOF .d format the same way. Both feed spectra into
spxtacular, the shared spectrum-processing
layer for deisotoping, deconvolution, and downstream analysis.
Links
- Docs: https://tacular-omics.github.io/mzmlpy/
- Changelog:
CHANGELOG.md
Citation
Citation metadata are provided in CITATION.cff. All archived releases are
available from Zenodo at doi:10.5281/zenodo.21960079.
Benchmarks
benchmarks/ contains a reproducible harness comparing mzmlpy against
pyteomics and pymzml
on compression-format support, throughput, and gzip handling.
Compared against pymzml 2.6.0 on a Bruker timsTOF file with ion mobility (10 spectra, 6.7 MB):
| Benchmark | mzmlpy | pymzml | Ratio |
|---|---|---|---|
| Startup | 0.012s | 0.092s | 8.0x faster |
| Iterate (decode) | 0.039s | 0.228s | 5.8x faster |
| Random access | 0.012s | 0.110s | 9.2x faster |
Both libraries produce identical m/z and intensity arrays. The gap narrows on smaller
files (~1.1–1.3x) and widens on larger, more complex files. See
benchmarks/README.md
for how to run it yourself, and the full results on the
Benchmarks page.
License
MIT — see LICENSE.
Release files for mzmlpy 0.9.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mzmlpy-0.9.3.tar.gz | 91.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mzmlpy-0.9.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 191.8 kB
Release files / mzmlpy-0.9.3.tar.gz
| Download URL | mzmlpy-0.9.3.tar.gz |
|---|---|
| Size | 91.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0b6b85684b39e8001608933f2ff845166656e64f3605cb9165d695280619f259
|
|
BLAKE2b-256 checksum How to use checksums |
c54880e6eeb7ce04d98fbb91e510061d37201b57b67c28ea3416267e77adb04e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 24, 2026.
Transparency logRelease files / mzmlpy-0.9.3-py3-none-any.whl
| Download URL | mzmlpy-0.9.3-py3-none-any.whl |
|---|---|
| Size | 100.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
865e6659f2249dc2f5ff03861a28c49b072344bffce6303c566a7222d853e8e8
|
|
BLAKE2b-256 checksum How to use checksums |
8c06586966923d61eab52fcfb9865f9e45d8b19cd6fdc306135082468203ea01
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 24, 2026.
Transparency log