diff --git a/formatscaper/core/utils.py b/formatscaper/core/utils.py
index 1aa31397fd357b87674fb2912ff138168ca463a3..b5650972bbcf4ea804dedd8b9140b188435a7ce5 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