Source code for fsspec_data.xarray_zarr
from __future__ import annotations
from collections.abc import Mapping
from importlib import import_module
from typing import Any
[docs]
def zarr_to_xarray(
source: Any,
target: Any | None,
*,
source_options: Mapping[str, Any],
target_options: Mapping[str, Any],
conversion_options: Mapping[str, Any],
) -> Any:
if target is not None:
raise ValueError("zarr-to-xarray conversion returns an object and does not accept a target")
if target_options:
raise ValueError("zarr-to-xarray conversion does not accept target_options")
options = dict(conversion_options)
_add_storage_options(options, source_options)
return _import_xarray().open_zarr(source, **options)
[docs]
def xarray_to_zarr(
source: Any,
target: Any | None,
*,
source_options: Mapping[str, Any],
target_options: Mapping[str, Any],
conversion_options: Mapping[str, Any],
) -> Any:
xarray = _import_xarray()
if not isinstance(source, (xarray.Dataset, xarray.DataArray)):
raise TypeError("xarray-to-zarr conversion requires an xarray Dataset or DataArray")
if source_options:
raise ValueError("xarray-to-zarr conversion does not accept source_options")
options = dict(conversion_options)
_add_storage_options(options, target_options)
return source.to_zarr(store=target, **options)
[docs]
def _add_storage_options(options: dict[str, Any], storage_options: Mapping[str, Any]) -> None:
if storage_options and "storage_options" in options:
raise ValueError("provide storage options through source_options or target_options, not conversion_options")
if storage_options:
options["storage_options"] = dict(storage_options)
[docs]
def _import_xarray():
try:
return import_module("xarray")
except ImportError as error:
raise ImportError("Xarray/Zarr conversion requires 'fsspec-data[xarray]'") from error