Handle invalid fieldnames when parsing python dict to matlab via struct

7 ビュー (過去 30 日間)
Benvaulter
Benvaulter 2018 年 5 月 8 日
編集済み: Martin Ryba 2024 年 9 月 1 日
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!

採用された回答

Benvaulter
Benvaulter 2018 年 5 月 8 日
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);
  1 件のコメント
Rik
Rik 2018 年 5 月 8 日
If this indeed solves your problem, you can mark this as accepted answer

サインインしてコメントする。

その他の回答 (1 件)

Steven Lord
Steven Lord 2018 年 5 月 8 日
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 件のコメント
Martin Ryba
Martin Ryba 2024 年 9 月 1 日
編集済み: Martin Ryba 2024 年 9 月 1 日
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

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeCall Python from MATLAB についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by