Source code for gfw.common.io
"""Module that contains simple IO utilities."""
import json
from pathlib import Path
from typing import Any, Callable, List, Union
import yaml
[docs]
def yaml_load(filename: str, **kwargs: Any) -> Any:
"""Loads a YAML file from the filesystem.
Args:
filename:
Path to the YAML file to be loaded.
**kwargs:
Additional keyword arguments passed to :func:`yaml.safe_load`.
Returns:
The Python object resulting from parsing the YAML file.
"""
with Path(filename).open("r") as f:
return yaml.safe_load(f, **kwargs)
[docs]
def yaml_save(path: str, data: dict[str, Any], **kwargs: Any) -> None:
"""Saves a dictionary to a YAML file.
Args:
path:
Path where the YAML file will be written.
data:
Dictionary or other serializable Python object to save.
**kwargs:
Additional keyword arguments passed to :func:`yaml.dump`.
"""
with open(path, "w") as outfile:
yaml.dump(data, outfile, default_flow_style=False, **kwargs)
[docs]
def json_load(
path: Path, lines: bool = False, coder: Callable[..., Any] = dict
) -> Union[List[dict[str, Any]], dict[str, Any]]:
"""Opens JSON file.
Args:
path:
The source path.
lines:
If True, expects JSON Lines format.
coder:
Coder to use when reading JSON records.
"""
if not lines:
with open(path) as file:
return json.load(file)
with open(path, "r") as file:
return [json.loads(each_line, object_hook=lambda d: coder(**d)) for each_line in file]
[docs]
def json_save(
path: Path, data: list[dict[Any, Any]], indent: int = 4, lines: bool = False
) -> Path:
"""Writes JSON file.
Args:
path:
The destination path.
data:
List of records to write.
indent:
Amount of indentation.
lines:
If True, writes in JSON Lines format.
"""
if not lines:
with open(path, mode="w") as file:
json.dump(data, file, indent=indent)
return path
with open(path, mode="w") as f:
for item in data:
f.write(json.dumps(item) + "\n")
return path