Source code for ard.utils.io
from pathlib import Path
from os import PathLike
import os
import yaml
[docs]
class Loader(yaml.SafeLoader):
def __init__(self, stream):
self._root = os.path.split(stream.name)[0]
super().__init__(stream)
[docs]
def include(self, node):
filename = os.path.join(self._root, self.construct_scalar(node))
with open(filename, "r") as f:
return yaml.load(f, self.__class__)
Loader.add_constructor("!include", Loader.include)
[docs]
def load_yaml(filename, loader=Loader, return_path=False) -> dict:
if isinstance(filename, dict):
return filename # filename already yaml dict
with open(filename) as fid:
if return_path:
return yaml.load(fid, loader), Path(filename).parent.absolute()
else:
return yaml.load(fid, loader)
[docs]
def check_create_folder(filepath):
already_exists = True
if not os.path.isdir(filepath):
os.makedirs(filepath, exist_ok=True)
already_exists = False
return already_exists
[docs]
def write_yaml(filename, data):
if not ".yaml" in filename:
filename = filename + ".yaml"
with open(filename, "w+") as file:
yaml.dump(data, file, sort_keys=False, encoding=None, default_flow_style=False)
[docs]
def replace_key_value(
target_dict: dict, target_key: str, new_value, replace_none_only=True
) -> dict:
"""
Recursively replace the value of a target key in a dictionary.
Parameters:
- target_dict (dict): The dictionary to process.
- target_key (str): The key whose value needs to be replaced.
- new_value: The new value to assign to the target key.
- replace_none_only (bool): if True, only 'None' values will be replaced.
Returns:
- dict: The updated dictionary.
"""
for key, value in target_dict.items():
if key == target_key:
if (value != None) and (replace_none_only):
continue
target_dict[key] = new_value
elif isinstance(value, dict):
# Recurse into nested dictionaries
replace_key_value(
value, target_key, new_value, replace_none_only=replace_none_only
)
elif isinstance(value, list):
# Handle lists of dictionaries
for item in value:
if isinstance(item, dict):
replace_key_value(
item, target_key, new_value, replace_none_only=replace_none_only
)
return target_dict