将字符串转换为Python 3中的字典列表

12

我有这样一条信息:

[{"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"}]

当我执行 type() 时,它显示为 <class 'str'>

如何将字符串转换为Python 3中的字典列表?

我尝试过使用literal_eval并得到了错误malformed node or string:,因此我不确定最好的方法是什么。

编辑

这里有一个可以重现的示例:

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))

以下是错误提示信息:

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>

我可能漏掉了检查空值的步骤吗?我好像在 line 137 的 eval 上得到了错误。我从下面提到的 stack overflow 评论中得到使用 ast.literal_eval 的想法。

这更多是数据问题而不是我处理方式的问题吗?我对 Python 不是很熟悉,所以我很可能遗漏了一些东西。


1
literal_eval 可以处理你的字符串。 - Ilya V. Schurov
2
对我来说,evalast.literal_evaljson.loads都可以在提供的字符串上正常工作,没有任何问题。 - jedwards
1
可能是重复的问题,参考将字典的字符串表示转换为字典? - theBrainyGeek
看一下上面的问题,它和你的问题是一样的。 - theBrainyGeek
5个回答

20
import json

data = json.loads(<your_string>)

3
如果用户的字符串(如果与所示相同)也可以使用literal_eval。无论问题是什么,问题可能不在于它是有效的JSON但无效的Python。您是否建议这是空/无值问题或其他问题? - DSM

8

我知道我的回答有些晚了,但希望对其他人有帮助:

你可以使用: pip install pyyaml import yaml

x = '[{"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"}]'

x = yaml.load(x)

现在字符串已经被转换为字典列表。

1
PyYAML的yaml.load()被记录为潜在不安全。而且在这里使用它也没有必要,因此没有理由建议使用它。 - Anthon
2
这对我来说很有用,可以从字符串中获取字典列表。yaml.load已被弃用,因为它很容易被利用(如@Anthon所评论的)。现在必须指定一个Loader。例如:yaml.load(x, Loader=yaml.BaseLoader)阅读https://github.com/yaml/pyyaml/wiki/PyYAML-yaml.load(input)-Deprecation以获取更多信息。 - daco

4

如果您的信息是字符串类型,您可以使用json模块。

import json

data = json.loads(<your_string>)

for element in data:
    for key, value in element.items():
        print("{}: {}".format(key, value))

1

有JSON编码器和解码器。您可以在这里查看文档。 json.loads(<to_be_convert_string>)

Python3示例及其输出

import json
data = json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
print(data) # ['foo', {'bar': ['baz', None, 1.0, 2]}]
print(type(data)) # <class 'list'>
print(type(data[0])) # <class 'str'>
print(type(data[1])) # <class 'dict'>

你可以在这个link上找到更多的例子。


0

那是列表类型吗?

你应该能够将一个变量设置为该列表,然后它应该可以工作。但是,如果数据是一个字面字符串,你可以这样做:

import json
test = json.loads('[{"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"}]')

print(type(test))
-><type 'list'>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接