Handle invalid fieldnames when parsing python dict to matlab via struct

7 visualizaciones (últimos 30 días)
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!

Respuesta aceptada

Benvaulter
Benvaulter el 8 de Mayo de 2018
I solved the issue by coverting the dict within python to json and then outputting the json to matlab where I then decode the data to retrieve the final struct which works perfectly fine for me so far. Here is the solution that I came up with:
pyClass = py.someClass.someSubClass();
data = x.someFunction();
data = py.json.dumps(data);
data = char(data);
data = jsondecode(data);

Más respuestas (1)

Steven Lord
Steven Lord el 8 de Mayo de 2018
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 comentario
Martin Ryba
Martin Ryba el 1 de Sept. de 2024
Editada: Martin Ryba el 1 de Sept. de 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

Iniciar sesión para comentar.

Categorías

Más información sobre Call Python from MATLAB en Help Center y File Exchange.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by