Исходный код EJIO.utils.dataset.operations

## /utils/dataset/operations.py

from pathlib import Path
from typing import Any
from ..system.file_utils import save_atomic
from .dataset_registry import DatasetRegistry

__all__ = [
    'save',
    'load',
    'register_storage_for_extension',
]

mapping = {
    'txt': 'csv',
    'csv': 'csv',
}


[документация] def register_storage_for_extension(extension: str, storage_name: str) -> None: """ Выставляет соответствие между расширением файла и хранилищем, ответственным за файлы с этим расширением. :param extension: Расширение файла. :param storage_name: Имя хранилища, под которым оно зарегестрировано в реестре. :raises KeyError: Если соответствие для расширения уже задано. """ if extension in mapping: raise KeyError(f"Serializer for extension '{extension}' already registered.") mapping[extension] = storage_name
def _detect_dataset_key(filename: str, forced_format: str | None) -> str: """ Внутренний хелпер: автоматически определяет ключ типа хранилища. на основе расширения файла, если forced_format равен None или дефолтному 'csv'. :param filename: Имя файла. :param forced_format: Ключ типа хранилища. :return: Ключ типа хранилища для подходящего расширения файла, если соответствие задано, или forced_format если он был явно передан в функцию или csv для всех остальных случаев. """ fmt = forced_format or Path(filename).suffix.lstrip('.').lower() detected_key = mapping.get(fmt) if detected_key and DatasetRegistry.has_key(detected_key): # type: ignore[attr-defined] return detected_key return forced_format or 'csv'
[документация] def save[T](data: list[dict[str, T]], filename: str, *, format: str | None = None, **kwargs: Any) -> None: """ Сохранить табличный набор данных (датасет) на диск через скрытый файл. :param data: Список словарей для сериализации. :param filename: Имя или путь к файлу. :param format: Строковый ключ типа хранилища. в глобальном регистре. :param kwargs: Дополнительные параметры. """ actual_key = _detect_dataset_key(filename, format) dataset_cls = DatasetRegistry.get(actual_key) def execute_write(temp_path: Path) -> None: dataset_cls.save(data, str(temp_path), **kwargs) save_atomic(filename, execute_write)
[документация] def load[T](filename: str, *, format: str | None = None, **kwargs: Any) -> list[dict[str, T]]: """ Загрузить табличный набор данных (датасет) из файла. :param filename: Имя или путь к файлу. :param format: Строковый ключ типа хранилища. в глобальном регистре. :param kwargs: Дополнительные параметры. :return: Список словарей. """ actual_key = _detect_dataset_key(filename, format) dataset_cls = DatasetRegistry.get(actual_key) return dataset_cls.load(filename, **kwargs)