Spaces:
Running
Running
| import os | |
| import json | |
| import scipy.io as spio | |
| import pandas as pd | |
| def loadmat(filename): | |
| ''' | |
| this function should be called instead of direct spio.loadmat | |
| as it cures the problem of not properly recovering python dictionaries | |
| from mat files. It calls the function check keys to cure all entries | |
| which are still mat-objects | |
| ''' | |
| data = spio.loadmat(filename, struct_as_record=False, squeeze_me=True) | |
| return dict_to_nonedict(_check_keys(data)) | |
| def _check_keys(dict): | |
| ''' | |
| checks if entries in dictionary are mat-objects. If yes | |
| todict is called to change them to nested dictionaries | |
| ''' | |
| for key in dict: | |
| if isinstance(dict[key], spio.matlab.mio5_params.mat_struct): | |
| dict[key] = _todict(dict[key]) | |
| return dict | |
| def _todict(matobj): | |
| ''' | |
| A recursive function which constructs from matobjects nested dictionaries | |
| ''' | |
| dict = {} | |
| for strg in matobj._fieldnames: | |
| elem = matobj.__dict__[strg] | |
| if isinstance(elem, spio.matlab.mio5_params.mat_struct): | |
| dict[strg] = _todict(elem) | |
| else: | |
| dict[strg] = elem | |
| return dict | |
| def dict_to_nonedict(opt): | |
| if isinstance(opt, dict): | |
| new_opt = dict() | |
| for key, sub_opt in opt.items(): | |
| new_opt[key] = dict_to_nonedict(sub_opt) | |
| return NoneDict(**new_opt) | |
| elif isinstance(opt, list): | |
| return [dict_to_nonedict(sub_opt) for sub_opt in opt] | |
| else: | |
| return opt | |
| class NoneDict(dict): | |
| def __missing__(self, key): | |
| return None | |
| def mat2json(mat_path=None, filepath = None): | |
| """ | |
| Converts .mat file to .json and writes new file | |
| Parameters | |
| ---------- | |
| mat_path: Str | |
| path/filename .mat存放路径 | |
| filepath: Str | |
| 如果需要保存成json, 添加这一路径. 否则不保存 | |
| Returns | |
| 返回转化的字典 | |
| ------- | |
| None | |
| Examples | |
| -------- | |
| >>> mat2json(blah blah) | |
| """ | |
| matlabFile = loadmat(mat_path) | |
| #pop all those dumb fields that don't let you jsonize file | |
| matlabFile.pop('__header__') | |
| matlabFile.pop('__version__') | |
| matlabFile.pop('__globals__') | |
| #jsonize the file - orientation is 'index' | |
| matlabFile = pd.Series(matlabFile).to_json() | |
| if filepath: | |
| json_path = os.path.splitext(os.path.split(mat_path)[1])[0] + '.json' | |
| with open(json_path, 'w') as f: | |
| f.write(matlabFile) | |
| return matlabFile |