Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert String to List of Dictionaries Python 3

I have a piece of information like so:

[{"city": "Beverly Hills", "state": "", "postal_code": "", "address": "Some Address", "country": "USA"}, {"city": "New York", "state": "NY", "postal_code": "", "address": "P.O. BOX 52404", "country": "USA"}]

When I do type() it shows as <class 'str'>.

How do I get this information from a string to a list of dictionaries in Python 3?

I've tried literal_eval and got an error malformed node or string:, so I am not sure what the best way to do this is.'

EDIT

Here is an example that should be reproducible:

mydata = {'programs': '["France"]', 'ids': '[]', 'citizenships': '[]', 'nationalities': '["FR"]', 'places_of_birth': '[]', 'dates_of_birth': '["1973-03-25"]', 'addresses': '[{"state": null, "postal_code": null, "address": null, "city": null, "country": "FR"}]'}
for key,value in mydata.items():
    if type(value) is str:
        result = literal_eval(value)
        print("value 1: ", value)
        print("value type 2:", type(value))
        print("result 3: ", result)
        print("result  4: ", type(result))
        for item in result:
            print("item in result 5:", item)
            print("type of item in result 6:", type(item))

Here is the error:

File "server.py", line 137, in insert_in_db result = literal_eval(value)
File "/Users/user/anaconda3/envs/apicaller/lib/python3.5/ast.py", line 84, in literal_eval return _convert(node_or_string)
File "/Users/user/anaconda3/envs/apicaller/lib/python3.5/ast.py", line 57, in _convert return list(map(_convert, node.elts))
File "/Users/user/anaconda3/envs/apicaller/lib/python3.5/ast.py", line 62, in _convert in zip(node.keys, node.values))
File "/Users/user/anaconda3/envs/apicaller/lib/python3.5/ast.py", line 61, in return dict((_convert(k), _convert(v)) for k, v
File "/Users/user/anaconda3/envs/apicaller/lib/python3.5/ast.py", line 83, in _convert raise ValueError('malformed node or string: ' + repr(node)) ValueError: malformed node or string: <_ast.Name object at 0x109baae48>

Maybe I am missing a step in between to check for null values? I seem to get the error on the eval line 137. I got the idea to use ast.literal_eval from that stack overflow comment mentioned below.

Is it more of a data issue than with the way I am handling it? I am not very familiar with Python so I am most likely missing something.

like image 461
unseen_damage Avatar asked Nov 10 '17 21:11

unseen_damage


People also ask

How do I convert a string to a dictionary in Python 3?

eval() is an inbuilt python library function used to convert string to dictionary efficiently. For this approach, you have to import the ast package from the python library and then use it with the literal_eval() method.

How do you turn a string of a dictionary into a dictionary?

To convert a string to dictionary, we have to ensure that the string contains a valid representation of dictionary. This can be done by eval() function. Abstract Syntax Tree (ast) module of Python has literal_eval() method which safely evaluates valid Python literal structure.


1 Answers

import json

data = json.loads(<your_string>)
like image 70
dimmg Avatar answered Nov 07 '22 05:11

dimmg