forked from center4ml/cell_identification
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserialize.py
77 lines (66 loc) · 1.74 KB
/
serialize.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# -*- coding: utf-8 -*-
import os
import json
import pickle
import yaml
try:
from yaml import CLoader as Loader, CDumper as Dumper
except ImportError:
from yaml import Loader, Dumper
def save_pickle(obj, fn):
provide_parent(fn)
with open(fn, 'wb') as f:
pickle.dump(obj, f)
def save_json(obj, fn):
provide_parent(fn)
with open(fn, 'w') as f:
json.dump(obj, f)
def save_yaml(obj, fn):
provide_parent(fn)
with open(fn, 'w') as f:
yaml.dump(obj, f, Dumper=Dumper)
def load_pickle(fn):
with open(fn, 'rb') as f:
obj = pickle.load(f)
return obj
def load_json(fn):
with open(fn) as f:
obj = json.load(f)
return obj
def load_yaml(fn):
with open(fn) as f:
obj = yaml.load(f, Loader=Loader)
return obj
def provide_parent(fn):
parent = os.path.split(fn)[0]
if parent:
os.makedirs(parent, exist_ok=True)
#%%
def parse_mode(mode, fn):
if mode is None:
fn = str(fn)
if fn.endswith('.pickle') or fn.endswith('.pkl'):
mode = 'pickle'
elif fn.endswith('.json'):
mode = 'json'
elif fn.endswith('.yaml'):
mode = 'yaml'
if not mode in ['json', 'pickle', 'yaml']:
raise ValueError(f'serialization mode unknown for {fn}, {mode}')
return mode
def save(obj, fn, mode=None):
mode = parse_mode(mode, fn)
if mode == 'pickle':
save_pickle(obj, fn)
elif mode == 'json':
save_json(obj, fn)
elif mode == 'yaml':
save_yaml(obj, fn)
def load(fn, mode=None):
mode = parse_mode(mode, fn)
if mode == 'pickle':
return load_pickle(fn)
elif mode == 'json':
return load_json(fn)
elif mode == 'yaml':
return load_yaml(fn)