pathtrees

Define your path structure at the top, then just fill in the variables later.
Install
pip install pathtrees
Usage
import pathtrees as pt
paths = Paths.define('./logs', {
'{log_id}': {
'model.h5': 'model',
'model_spec.pkl': 'model_spec',
'plots': {
'epoch_{step:.4d}': {
'{plot_name}.png': 'plot',
'': 'plot_dir',
}
},
'', 'log_dir',
}
})
paths.update(log_id='test1', step=-1)
class MyCallback(Callback):
def on_epoch_end(self, epoch, logs):
epoch_paths = paths.specify(step=epoch)
...
plt.imsave(epoch_paths.plot.specify(plot_name='confusion_matrix'))
...
plt.imsave(epoch_paths.plot.specify(plot_name='auc'))
for path in paths.plot.specify(plot_name='auc').glob():
print(path)
Path Formatting
path = pathtrees.Path('data/{sensor_id}/raw/{date}/temperature_{file_id:04d}.csv')
path.update(sensor_id='aaa')
try:
path.format()
except KeyError:
print("oops gotta provide more data!")
assert path.partial_format() == 'data/aaa/raw/{date}/temperature_{file_id:04d}.csv'
assert path.glob_format() == 'data/aaa/raw/*/temperature_*.csv'
try:
path.format(date='111')
except KeyError:
print("oops gotta provide more data!")
assert path.partial_format(date='111') == 'data/aaa/raw/111/temperature_{file_id:04d}.csv'
assert path.glob_format(date='111') == 'data/aaa/raw/111/temperature_*.csv'
assert path.format(date='111', fild_id=2) == 'data/aaa/raw/111/temperature_0002.csv'
assert path.partial_format(date='111', fild_id=2) == 'data/aaa/raw/111/temperature_0002.csv'
assert path.glob_format(date='111', fild_id=2) == 'data/aaa/raw/111/temperature_0002.csv'
path2 = path.specify(date='111')
path2.update(date='222', fild_id=2)
import os
assert os.fspath(path) == path.format()
assert str(path) == path.partial_format()
TODO:
- docstrings and examples !!!
- decide what I want to do about
format_path, partial_format_path, etc. (too verbose)
- publish RTD