【问题标题】:Convert String to List of Dictionaries Python 3将字符串转换为字典列表 Python 3
【发布时间】:2018-04-24 04:39:32
【问题描述】:

我有这样一条信息:

[{"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))

这是错误:

文件“server.py”,第 137 行,在 insert_in_db 结果 = literal_eval(值)
文件“/Users/user/anaconda3/envs/apcaller/lib/python3.5/ast.py”,第 84 行,位于 literal_eval 中 返回 _convert(node_or_string)
_convert 中的文件“/Users/user/anaconda3/envs/apcaller/lib/python3.5/ast.py”,第 57 行 返回列表(地图(_convert,node.elts))
_convert 中的文件“/Users/user/anaconda3/envs/apcaller/lib/python3.5/ast.py”,第 62 行 在 zip(node.keys, node.values))
文件“/Users/user/anaconda3/envs/apcaller/lib/python3.5/ast.py”,第 61 行,在 返回 dict((_convert(k), _convert(v)) 为 k, v
文件“/Users/user/anaconda3/envs/apcaller/lib/python3.5/ast.py”,第 83 行,在 _convert raise ValueError('错误的节点或字符串:' + repr(node)) ValueError:错误的节点或字符串:<_ast.name object at>

也许我错过了检查空值的步骤?我似乎在 eval line 137 上得到了错误。我从下面提到的堆栈溢出评论中得到了使用ast.literal_eval 的想法。

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

【问题讨论】:

标签: python string python-3.x list dictionary


【解决方案1】:
import json

data = json.loads(<your_string>)

【讨论】:

  • 用户的字符串(如果如图所示)也应该与 literal_eval 一起使用。不管问题是什么,问题可能不在于它是有效的 JSON 而不是有效的 Python。您是在提议这是一个 null/None 问题还是什么?
【解决方案2】:

我知道我回答得很晚,但希望对其他人有所帮助:

您可以使用: 点安装 pyyaml 导入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)

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

【讨论】:

  • PyYAML 的 yaml.load() 被记录为可能不安全。这里也没有必要使用它,所以没有任何借口建议使用它。
  • 这对我有用,可以从 str 获取字典列表。 yaml.load 已被弃用,因为它很容易被利用(正如@Anthon 评论的那样)。现在必须指定一个加载器。例如yaml.load(x, Loader=yaml.BaseLoader) 阅读github.com/yaml/pyyaml/wiki/PyYAML-yaml.load(input)-Deprecation 了解更多信息。
【解决方案3】:

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

import json

data = json.loads(<your_string>)

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

【讨论】:

    【解决方案4】:

    那是列表类型?

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      • 1970-01-01
      • 2022-01-03
      • 2011-07-12
      • 2014-05-23
      相关资源
      最近更新 更多