From 3d5bc518bb692a23e25a54083ea3eba82f28d8b1 Mon Sep 17 00:00:00 2001 From: sbosse Date: Wed, 28 Aug 2024 21:58:10 +0200 Subject: [PATCH] Wed 28 Aug 21:58:08 CEST 2024 --- bin/mat2json.py | 77 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 bin/mat2json.py diff --git a/bin/mat2json.py b/bin/mat2json.py new file mode 100644 index 0000000..d0e5071 --- /dev/null +++ b/bin/mat2json.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +""" +Created : 21-06-2018 +Last Modified : Fri 22 Jun 2018 06:46:45 PM EDT +Created By : Enrique D. Angola +""" + +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 _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 mat2json(filename=None,filepath = ''): + """ + Converts .mat file to .json and writes new file + + Parameters + ---------- + filename: Str + path/filename of .mat file + filepath: Str + path to write converted file + + Returns + ------- + None + + Examples + -------- + >>> mat2json(blah blah) + + """ + + matlabFile = loadmat(filename) + #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() + with open(filepath+filename[0:-4]+'.json','w') as f: + f.write(matlabFile) + +mat2json('test.mat')