Handle invalid fieldnames when parsing python dict to matlab via struct
Show older comments
I am trying to convert a python dict to a Matlab struct like so:
pyClass = py.someClass.someSubClass();
data = x.someFunction();
data = struct(data);
This usually works fine, however, Matlab throws the following error:
Error using py.dict/struct
Invalid field name "yyy/xxx"
I know that Matlab requires the following three conditions for fieldnames to be valid:
start with a letter, otherwise assigning to that field will error
contain only letters, numbers, and/or the underscore character, otherwise assigning to that field will error,
and must be no longer than namelengthmax (currently 63) characters, otherwise you will receive a warning and the field name will be truncated
Does anyone know how I can handle this error - i.e. have a small python function that I can call from within Matlab to remove invalid characters?
Here is a snippet of what the python dict looks like (in this case the "/" is the issue):
data =
Python dict with no properties.
{'BTC/USD': {'fee_loaded': False, 'percentage': True, 'tierBased': True, 'maker': 0.001, 'taker': 0.002, 'tiers': {'taker': [[0, 0.002], ...
Thanks in advance!
Accepted Answer
More Answers (1)
Steven Lord
on 8 May 2018
0 votes
If you can get a list of the names in your dict object that you want to be the fieldnames in the MATLAB struct array, pass them through matlab.lang.makeValidName.
1 Comment
Martin Ryba
on 1 Sep 2024
Edited: Martin Ryba
on 1 Sep 2024
So, it would be very handy if there was flag to the struct() function to do this. I can't use the JSON hack as dumps() is erroring on "Object of type MaskedArray is not JSON serializable". Is there a sample script as to how we extract the names from the dict, clean them up, and then pass the right pieces into struct()? Otherwise, I'm stuck.
Follow-up: I found I could use the dict object's get() method to retrieve just the keys I wanted and avoid the unwanted one with the bad name:
dat = radar.fields.get('reflectivity'); % Retrieve reflectivity from dict of dicts
data = double(dat.get('data')); % Pull the data and convert numpy MaskedArray to double
Categories
Find more on Call Python from MATLAB in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!