Skip to main content

Python bindings for the Open-Meteo file format

Project description

Python bindings for Open Meteo file format

Python 3.9+ PyPI version Build and Test

Installation

pip install omfiles

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

Reading

Basic reading

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 desired variables from S3 spatial files

import fsspec
import numpy as np
from omfiles import OmFileReader

# URI of the file on S3
s3_uri = "s3://openmeteo/data_spatial/dwd_icon/2025/09/23/0000Z/2025-09-30T0000.om"
# 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", "same_names": True},  # 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

Simple 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)

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

omfiles-0.1.1.tar.gz (200.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

omfiles-0.1.1-cp39-abi3-win_amd64.whl (802.3 kB view details)

Uploaded CPython 3.9+Windows x86-64

omfiles-0.1.1-cp39-abi3-musllinux_1_2_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ x86-64

omfiles-0.1.1-cp39-abi3-manylinux_2_28_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ x86-64

omfiles-0.1.1-cp39-abi3-manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ ARM64

omfiles-0.1.1-cp39-abi3-macosx_11_0_arm64.whl (936.1 kB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

omfiles-0.1.1-cp39-abi3-macosx_10_12_x86_64.whl (918.9 kB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

Details for the file omfiles-0.1.1.tar.gz.

File metadata

  • Download URL: omfiles-0.1.1.tar.gz
  • Upload date:
  • Size: 200.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.9.4

File hashes

Hashes for omfiles-0.1.1.tar.gz
Algorithm Hash digest
SHA256 1d2705c0df1d38023d4985e519f6900371d378a4f2fbf6964284f0a796b203a7
MD5 3760ffa2d619a2e7bbcf347a0e0eadc2
BLAKE2b-256 0030ae16f9a8cd32d210e2fedcd5342bc58ad32c06c57e19c12f4a140a8156ef

See more details on using hashes here.

File details

Details for the file omfiles-0.1.1-cp39-abi3-win_amd64.whl.

File metadata

  • Download URL: omfiles-0.1.1-cp39-abi3-win_amd64.whl
  • Upload date:
  • Size: 802.3 kB
  • Tags: CPython 3.9+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.9.4

File hashes

Hashes for omfiles-0.1.1-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 892837e8d5e3f56fa1e5e11242abfc22497afa31b965c3640e620b3a890211d2
MD5 8f35f17b52f632f784c66fa2ec55ca98
BLAKE2b-256 1f819d271ebe2cfe409170fdbae544f4a8cae1e70e60e5cfbbfea0cb9f6c3f37

See more details on using hashes here.

File details

Details for the file omfiles-0.1.1-cp39-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for omfiles-0.1.1-cp39-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2d2389f0f77976e7560157808ead25733a4d5abd3ab65c2e21bc6b19210e78e3
MD5 7d1c12d86d60cd35fc1f252266c408f5
BLAKE2b-256 0eef073dd47953c1619b51276a202fbc86b21d80d82fb0d275e703bd9fc209ca

See more details on using hashes here.

File details

Details for the file omfiles-0.1.1-cp39-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for omfiles-0.1.1-cp39-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f3b8c0d4bf19872cc048478590ab98bd7412d80ea433b10ce2907982643210a5
MD5 587116d157fec7d43642be464e57d7c0
BLAKE2b-256 c62d83ba85a044587fc939f08b20363b1a3ac2fcefa4ae65cd57341a1d495e4c

See more details on using hashes here.

File details

Details for the file omfiles-0.1.1-cp39-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for omfiles-0.1.1-cp39-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f22d2fa5aa62a66af965517a218f4c51a09a336a2fe3cbc2d73e2b66df64d2b6
MD5 473d79d97ccc86d489a034ae791788be
BLAKE2b-256 d131f7bb798954a459721132e42c5f70b282adda2a326ba72720503647bfdce9

See more details on using hashes here.

File details

Details for the file omfiles-0.1.1-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for omfiles-0.1.1-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 be65ed86a467b639a84a94b25d77b5dbd37754a97ac988871e30fb04c3f5ed84
MD5 b5de3fd73d2af8f33d98bd4bf60523bb
BLAKE2b-256 1f5eabc466228b0c908c6a503807a6e1b685b53a2eb7997558d428845887922f

See more details on using hashes here.

File details

Details for the file omfiles-0.1.1-cp39-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for omfiles-0.1.1-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 e9d29b54b68fffcc06ecfc8f9c164bfddfb1bad6eb9723ac379b21c718bafd95
MD5 958292df84dfe7aeceb6b4a3f2ca8bae
BLAKE2b-256 8d8b9085891b0972c90d3acd3c701e2a0ed598fda20d69538b3ca448ade4beda

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page