From 11370e65688d65afec91d2b058fe2106f0b5ce31 Mon Sep 17 00:00:00 2001 From: Maximilian Moser <maximilian.moser@tuwien.ac.at> Date: Wed, 7 Feb 2024 15:28:07 +0100 Subject: [PATCH] Add utility function to load results from file --- formatscaper/core/utils.py | 40 +++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/formatscaper/core/utils.py b/formatscaper/core/utils.py index 1aa3139..b565097 100644 --- a/formatscaper/core/utils.py +++ b/formatscaper/core/utils.py @@ -1,6 +1,7 @@ import pickle +import re import sys -from typing import Dict, List +from typing import Dict, List, Optional import yaml @@ -84,3 +85,40 @@ def store_results(results: List[Result], file_name: str, file_format: str) -> bo file=sys.stderr, ) return False + + +def load_results( + file_name: str, file_format: Optional[str] = None +) -> Optional[List[Result]]: + """Load the results from the given file. + + In case the ``file_format`` isn't specified, auto-detection is attempted. + """ + if file_format is None: + if re.search(r"\.ya?ml$", file_name, re.IGNORECASE): + file_format = "yaml" + elif re.search(r"\.pickle$", file_name, re.IGNORECASE): + file_format = "pickle" + + if file_format not in {"pickle", "yaml"}: + print(f"WARN: invalid file format ({file_format})", file=sys.stderr) + return None + + raw_results = [] + if file_format == "pickle": + raw_results = pickle.load(file_name) + elif file_format == "yaml": + with open(file_name, "r") as results_file: + raw_results = yaml.safe_load(results_file) + + # note: we deduplicate formats so that manipulation of one entry updates all entries + results = [] + known_formats = {} + for res in raw_results: + format = known_formats.setdefault( + res["format"]["puid"], Format(**res["format"]) + ) + res.pop("format", None) + results.append(Result(**res, format=format)) + + return results -- GitLab