Skip to main content

Python bindings for the Open-Meteo file format

Project description

Python Bindings for Open Meteo File Format

Python 3.9 | 3.10 | 3.11 | 3.12 | 3.13 | 3.14 PyPI version Build and Test

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)

Stability Notice

This project is now stable as of version 1.0.0. The public API is considered stable and will follow semantic versioning. Breaking changes will not be introduced in 1.x releases without a major version bump.

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 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
# Note: Spatial data is only retained for 7 days. The example file below may no longer exist.
# Please update the URI to match a currently available file.
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"},  # 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)

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-1.1.0.tar.gz (254.7 kB view details)

Uploaded Source

Built Distributions

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

omfiles-1.1.0-cp39-abi3-win_arm64.whl (978.4 kB view details)

Uploaded CPython 3.9+Windows ARM64

omfiles-1.1.0-cp39-abi3-win_amd64.whl (803.6 kB view details)

Uploaded CPython 3.9+Windows x86-64

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

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

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

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

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

Uploaded CPython 3.9+manylinux: glibc 2.28+ ARM64

omfiles-1.1.0-cp39-abi3-macosx_11_0_arm64.whl (955.6 kB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

omfiles-1.1.0-cp39-abi3-macosx_10_12_x86_64.whl (971.8 kB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

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

File metadata

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

File hashes

Hashes for omfiles-1.1.0.tar.gz
Algorithm Hash digest
SHA256 a3e83ecabbb1a6b2f75bb7d2179f9cbf68801bab6e9d9852a4c77db8e669379b
MD5 b0ab1a28ebd8167fe0b7bcdbaf983c86
BLAKE2b-256 6e8c6a0740b3a19549a3c6589136dab5fc2a02374b779ece343e6cc684a80660

See more details on using hashes here.

File details

Details for the file omfiles-1.1.0-cp39-abi3-win_arm64.whl.

File metadata

  • Download URL: omfiles-1.1.0-cp39-abi3-win_arm64.whl
  • Upload date:
  • Size: 978.4 kB
  • Tags: CPython 3.9+, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.11.5

File hashes

Hashes for omfiles-1.1.0-cp39-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 64dcf41437e70fdd322ab05fb52584c05b268599ba09ab7f0041368cf127fca2
MD5 7efb150604d41dcd8a2bbd44baa99c75
BLAKE2b-256 8757e3588048ed27c461c6da12884d7dfe94b5e44f7acaaf4cb93417857b624f

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for omfiles-1.1.0-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 f6cd98f3f85f1ac9493c5b9c88d44031a2f4b8653b59f844f6199e1f23c57a67
MD5 b8dd68bc5dfcb9ab63fa1547fd18801e
BLAKE2b-256 89f10c26ccfc454df862db4e2e980aedba864c1ff30a512baf7921b8867a7c2e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for omfiles-1.1.0-cp39-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2f4b7c12920eed2625993baf13efe04e25aaf62b37f466281c8fd7c1c7e3197f
MD5 730ab2aed1227e0a39713b22e2f8c2e0
BLAKE2b-256 12381438cc9bbc4e375317afc1fcc7953bbada8aa1ba28d16b6023321a9b8c71

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for omfiles-1.1.0-cp39-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c586dbd91167a50c5479d5a3bc1a10545d3f0736af4b39f2aa5432433090eff9
MD5 5d5cdb7d1f371d5ce99e765b21d32289
BLAKE2b-256 debb8b49b21fcb2984e79707e45fab0a0552b36ca44ed1cb617c8c77308c5741

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for omfiles-1.1.0-cp39-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 3b32d030ead89c175b228dcaa358a92ec8b58a5af99c37c3460445d0e1a00c97
MD5 7cfd96d5d921256ef12d951db363a8ac
BLAKE2b-256 2a62ce2a62c9911911eb430ca26acceab266baf030b3090eca2e0986f8556585

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for omfiles-1.1.0-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 833ecdf32aa2426ced2d9987930ebcd1a5a33939cc6517eaee186e56c89eb02b
MD5 1ca4867f60d9954a38429acbec7ea725
BLAKE2b-256 b6d66e103dff6bf8cd39891f9f58511b168ed02c2a6ab5b93b9e3813ca0fbd3e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for omfiles-1.1.0-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 5e725a9ee0cae6b031639104bee5ee86ba56940ae5f64942e45ba56292cecdbd
MD5 7ea65f69462047747fc353effd5d9b7e
BLAKE2b-256 2a54ea5fe78c9e04861e3c6f5e194d65151a98e59e60fb5323d14b5169e0214f

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