Module mudcod.sutils
Expand source code
import collections
import csv
import time
from datetime import datetime
from pathlib import Path
import yaml
ISO_FORMAT = "%Y-%m-%dT%H:%M:%S.%f"
def read_csv_to_dict(path):
columns = collections.defaultdict(list)
with open(path) as f:
reader = csv.DictReader(f)
for row in reader:
for (k, v) in row.items():
columns[k].append(v)
return columns
def write_to_csv(path, header, *args):
ensure_file_dir(path)
if path.exists():
aw = "a"
wrt_header = False
else:
aw = "w"
wrt_header = True
with open(path, aw, encoding="utf-8", newline="") as f:
writer = csv.writer(f)
if wrt_header:
writer.writerow(header)
for values in args:
writer.writerow(values)
def timeit(f):
def wrapper(*args, **kwargs):
log("Started:", f.__qualname__)
t = time.time()
res = f(*args, **kwargs)
log(f"Finished: {f.__qualname__} elapsed: {time.time() - t:.2f}s")
return res
return wrapper
def safe_create_dir(d: Path):
"""
Uses new pathlib
Parameters
----------
d: :obj:`pathlib.Path`
"""
if not d.exists():
log("Directory is not found, creating:", d)
d.mkdir(parents=True)
def ensure_file_dir(file_path: Path):
"""
Uses new pathlib
Parameters
----------
file_path: :obj:`pathlib.Path`
"""
safe_create_dir(file_path.parent)
log_f = None
log_p = None
def change_log_path(path):
global log_p, log_f
if log_p == path:
return
if log_f:
log_f.close()
log_p = path
ensure_file_dir(path)
log_f = open(path, "a")
log("Initialized log_path:", path)
def logr(*args, **kwargs):
log(*args, **kwargs, end="\r")
def log(*args, **kwargs):
ts = datetime.now().strftime(ISO_FORMAT)[:-3]
if "ts" not in kwargs or kwargs["ts"] is not False:
args = [ts, *args]
if "ts" in kwargs:
del kwargs["ts"]
print(*args, **kwargs, flush=True)
if log_f:
print(*args, **kwargs, file=log_f)
log_f.flush()
def load_yaml(path):
with open(path, "r") as stream:
try:
return yaml.safe_load(stream)
except yaml.YAMLError as exc:
log(exc)
Functions
def change_log_path(path)
-
Expand source code
def change_log_path(path): global log_p, log_f if log_p == path: return if log_f: log_f.close() log_p = path ensure_file_dir(path) log_f = open(path, "a") log("Initialized log_path:", path)
def ensure_file_dir(file_path: pathlib.Path)
-
Uses new pathlib Parameters
file_path
::obj:
pathlib.Path``
Expand source code
def ensure_file_dir(file_path: Path): """ Uses new pathlib Parameters ---------- file_path: :obj:`pathlib.Path` """ safe_create_dir(file_path.parent)
def load_yaml(path)
-
Expand source code
def load_yaml(path): with open(path, "r") as stream: try: return yaml.safe_load(stream) except yaml.YAMLError as exc: log(exc)
def log(*args, **kwargs)
-
Expand source code
def log(*args, **kwargs): ts = datetime.now().strftime(ISO_FORMAT)[:-3] if "ts" not in kwargs or kwargs["ts"] is not False: args = [ts, *args] if "ts" in kwargs: del kwargs["ts"] print(*args, **kwargs, flush=True) if log_f: print(*args, **kwargs, file=log_f) log_f.flush()
def logr(*args, **kwargs)
-
Expand source code
def logr(*args, **kwargs): log(*args, **kwargs, end="\r")
def read_csv_to_dict(path)
-
Expand source code
def read_csv_to_dict(path): columns = collections.defaultdict(list) with open(path) as f: reader = csv.DictReader(f) for row in reader: for (k, v) in row.items(): columns[k].append(v) return columns
def safe_create_dir(d: pathlib.Path)
-
Uses new pathlib Parameters
d
::obj:
pathlib.Path``
Expand source code
def safe_create_dir(d: Path): """ Uses new pathlib Parameters ---------- d: :obj:`pathlib.Path` """ if not d.exists(): log("Directory is not found, creating:", d) d.mkdir(parents=True)
def timeit(f)
-
Expand source code
def timeit(f): def wrapper(*args, **kwargs): log("Started:", f.__qualname__) t = time.time() res = f(*args, **kwargs) log(f"Finished: {f.__qualname__} elapsed: {time.time() - t:.2f}s") return res return wrapper
def write_to_csv(path, header, *args)
-
Expand source code
def write_to_csv(path, header, *args): ensure_file_dir(path) if path.exists(): aw = "a" wrt_header = False else: aw = "w" wrt_header = True with open(path, aw, encoding="utf-8", newline="") as f: writer = csv.writer(f) if wrt_header: writer.writerow(header) for values in args: writer.writerow(values)