Python Bindings for Open Meteo File Format
Features
- Read Open-Meteo (
.om) files directly from cloud storage using Python - Traverse the hierarchical data structure
- Arrays/array slices are returned directly as NumPy arrays
- Support for fsspec and xarray
- Chunked data access behind the scenes
Installation
pip install omfiles
Pre-Built Wheels & Platform Support
We provide pre-built wheels for the following platforms:
- Linux x86_64 (
manylinux_2_28_x86_64) - Linux aarch64 (
manylinux_2_28_aarch64) - Linux musl x86_64 (
musllinux_1_2_x86_64) - Windows x86_64 (
win_amd64) - Windows ARM64 (
win_arm64) - macOS x86_64 (
macosx_10_12_x86_64) - macOS ARM64 (
macosx_11_0_arm64)
Reading
Reading Files without Hierarchy
OM files are structured like a tree of variables.
The following example assumes that the file test_file.om contains an array variable as a root variable which has a dimensionality greater than 2 and a size of at least 2x100:
from omfiles import OmFileReader
reader = OmFileReader("test_file.om")
data = reader[0:2, 0:100, ...]
reader.close() # Close the reader to release resources
Reading Hierarchical Files, e.g. S3 Spatial Files
import datetime as dt
import fsspec
import numpy as np
from omfiles import OmFileReader
# Example: URI for a spatial data file in the `data_spatial` S3 bucket
# See data organization details: https://github.com/open-meteo/open-data?tab=readme-ov-file#data-organization
MODEL_DOMAIN = "dwd_icon"
# Note: Spatial data is only retained for 7 days. The script uses one file within this period.
date_time = dt.datetime.now(dt.timezone.utc) - dt.timedelta(days=2)
S3_URI = (
f"s3://openmeteo/data_spatial/{MODEL_DOMAIN}/{date_time.year}/"
f"{date_time.month:02}/{date_time.day:02}/0000Z/"
f"{date_time.strftime('%Y-%m-%d')}T0000.om"
)
print(f"Using om file: {S3_URI}")
# Create and open filesystem, wrapping it in a blockcache
backend = fsspec.open(
f"blockcache::{S3_URI}",
mode="rb",
s3={"anon": True, "default_block_size": 65536}, # s3 settings
blockcache={"cache_storage": "cache"}, # blockcache settings
)
# Create reader from the fsspec file object using a context manager.
# This will automatically close the file when the block is exited.
with OmFileReader(backend) as root:
# We are at the root of the data hierarchy!
# What type of node is this?
print(f"root.is_array: {root.is_array}") # False
print(f"root.is_scalar: {root.is_scalar}") # False
print(f"root.is_group: {root.is_group}") # True
temperature_reader = root.get_child_by_name("temperature_2m")
print(f"temperature_reader.is_array: {temperature_reader.is_array}") # True
print(f"temperature_reader.is_scalar: {temperature_reader.is_scalar}") # False
print(f"temperature_reader.is_group: {temperature_reader.is_group}") # False
# What shape does the stored array have?
print(f"temperature_reader.shape: {temperature_reader.shape}") # (1441, 2879)
# Read all data from the array
temperature_data = temperature_reader.read_array((...))
print(f"temperature_data.shape: {temperature_data.shape}") # (1441, 2879)
# It's also possible to read any subset of the array
temperature_data_subset1 = temperature_reader.read_array((slice(0, 10), slice(0, 10)))
print(temperature_data_subset1)
print(f"temperature_data_subset1.shape: {temperature_data_subset1.shape}") # (10, 10)
# Numpy basic indexing is supported for direct access if the reader is an array.
temperature_data_subset2 = temperature_reader[0:10, 0:10]
print(temperature_data_subset2)
print(f"temperature_data_subset2.shape: {temperature_data_subset2.shape}") # (10, 10)
# Compare the two temperature subsets and verify that they are the same
are_equal = np.array_equal(temperature_data_subset1, temperature_data_subset2, equal_nan=True)
print(f"Are the two temperature subsets equal? {are_equal}")
Writing
Single Array
import numpy as np
from omfiles import OmFileWriter
# Create sample data
data = np.random.rand(100, 100).astype(np.float32)
# Initialize writer
writer = OmFileWriter("simple.om")
# Write array with compression
array_variable = writer.write_array(
data,
chunks=[50, 50],
scale_factor=1.0,
add_offset=0.0,
compression="pfor_delta_2d",
name="data"
)
# Finalize the file using array_variable as entry-point
writer.close(array_variable)
Hierarchical Structure
import numpy as np
from omfiles import OmFileWriter
# Create sample data
features = np.random.rand(1000, 64).astype(np.float32)
labels = np.random.randint(0, 10, size=(1000,), dtype=np.int32)
# Initialize writer
writer = OmFileWriter("hierarchical.om")
# Write child arrays first
features_var = writer.write_array(features, chunks=[100, 64], name="features", compression="pfor_delta_2d")
labels_var = writer.write_array(labels, chunks=[100], name="labels")
metadata_var = writer.write_scalar(42, name="metadata")
# Create root group with children
root_var = writer.write_group(
name="root",
children=[features_var, labels_var, metadata_var],
)
# Finalize the file using root_var as entry-point into the hierarchy
writer.close(root_var)
Examples
There are some examples how to use this library in examples/. They should be run as uv scripts to automatically setup the correct python environment.
uv run examples/plot_map.py
Development
# install the required dependencies in .venv directory
uv sync
# to run the tests
uv run pytest tests/
# to build the wheels
uv run build
# or to trigger maturin directly:
# maturin develop
Tests
cargo test
runs rust tests.
uv run pytest tests/
runs Python tests.
Python Type Stubs
Can be generated from the rust doc comments via
cargo run stub_gen
Metadata
Release files for omfiles 1.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| omfiles-1.2.0.tar.gz | 250.5 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| omfiles-1.2.0-cp310-abi3-win_arm64.whl | CPython 3.10 | abi3 | Windows ARM64 | Details |
| omfiles-1.2.0-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details |
| omfiles-1.2.0-cp310-abi3-musllinux_1_2_x86_64.whl | CPython 3.10 | abi3 | Linux musl 1.2+ x86-64 | Details |
| omfiles-1.2.0-cp310-abi3-manylinux_2_28_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.28+ x86-64 | Details |
| omfiles-1.2.0-cp310-abi3-manylinux_2_28_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.28+ ARM64 | Details |
| omfiles-1.2.0-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
| omfiles-1.2.0-cp310-abi3-macosx_10_12_x86_64.whl | CPython 3.10 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 7.9 MB
Release files / omfiles-1.2.0.tar.gz
| Download URL | omfiles-1.2.0.tar.gz |
|---|---|
| Size | 250.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ca42ebb260de73e937cb4a72d1867e34e7046f19105202c01d1455c72abf6895
|
|
BLAKE2b-256 checksum How to use checksums |
df43a8937afc980168ff1aef7350dafac7ce460592dc4f115bc2135c60fdc001
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.13.1
|
Release files / omfiles-1.2.0-cp310-abi3-win_arm64.whl
| Download URL | omfiles-1.2.0-cp310-abi3-win_arm64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.10 Windows ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
fd242b62d18923ed338e2a59419564d5b41a28438d8dd284e3f95eb9b59824ff
|
|
BLAKE2b-256 checksum How to use checksums |
493ec32b9a7214eddea39e99a1ee78af67d796b544abd4354f3296022901a037
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.13.1
|
Release files / omfiles-1.2.0-cp310-abi3-win_amd64.whl
| Download URL | omfiles-1.2.0-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 869.6 kB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
fa81ae39c643e80246abdcef370e89d187d64511ba6cd72d4a88a2dc4f1ecb44
|
|
BLAKE2b-256 checksum How to use checksums |
0b5b2f1b892c3764e71aaf9c7d5698bb3cc630d01d79c1632bf442ad8536fb32
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.13.1
|
Release files / omfiles-1.2.0-cp310-abi3-musllinux_1_2_x86_64.whl
| Download URL | omfiles-1.2.0-cp310-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.10 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
0d5754fdd07ce93e19e4302129963abb35257d04ed51b5fc4bfd89ee40d88b70
|
|
BLAKE2b-256 checksum How to use checksums |
ad11c9e9027fa32877f892567dc4eeffd3a4eb7e61ad24e28fd4bc5f76237827
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.13.1
|
Release files / omfiles-1.2.0-cp310-abi3-manylinux_2_28_x86_64.whl
| Download URL | omfiles-1.2.0-cp310-abi3-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.10 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
525082edbf7d583d0215b9930debcea3addd1cb99144b610a5f00191a1191d39
|
|
BLAKE2b-256 checksum How to use checksums |
8af2d64d9f3424ccbcc94850fcaca04de05d1dd7db8d1c5bbfda63ee37159c3e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.13.1
|
Release files / omfiles-1.2.0-cp310-abi3-manylinux_2_28_aarch64.whl
| Download URL | omfiles-1.2.0-cp310-abi3-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.10 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
bb40290c7661978490ae43ec156ab0a14ccb2311f81d74ff7c5067c04094195e
|
|
BLAKE2b-256 checksum How to use checksums |
8f7844f3f9cfc4bdd13af9992386b538ca4ad0eeb3f22e692814ace004c8924e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.13.1
|
Release files / omfiles-1.2.0-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | omfiles-1.2.0-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.0 MB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
05a04d1d3c3530954d81e471335053fdc5331d52323c332c66b99f1855a7871d
|
|
BLAKE2b-256 checksum How to use checksums |
861bc3f65a2c6bb5f1c236af66cb77acbd185ee657181cebb19398cbcc84c9e7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.13.1
|
Release files / omfiles-1.2.0-cp310-abi3-macosx_10_12_x86_64.whl
| Download URL | omfiles-1.2.0-cp310-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.0 MB |
| Tags | CPython 3.10 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
4298616241141234c53a1815f5f07b7262d1b3261f8fd73671cb7b62a28b914d
|
|
BLAKE2b-256 checksum How to use checksums |
61966f7f6036718779761fa00ccc11358ed1bc03a162e9dbd2fc4fd1d3de5800
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
maturin/1.13.1
|