【问题标题】:Converting string to dictionary python [duplicate]将字符串转换为字典python [重复]
【发布时间】:2015-04-29 22:07:46
【问题描述】:

我创建了一个文件并且有一个字典。 现在我想要文件中的那个字典,但我不想要字符串,也不想要换行符。 我得到了这样的东西:

"{'Greennhouse 1': {'Product': '4', 'Location of greenhouse': '2',
'Unities of the product': 6, 'Designation': '1', 'Growth state of the
product': '5', 'Code of wsn': 1, 'Area of greenhouse': 3}}\n"

但我想要这个:

{'Greennhouse 1': {'Product': '4', 'Location of greenhouse': '2',
'Unities of the product': 6, 'Designation': '1', 'Growth state of the
product': '5', 'Code of wsn': 1, 'Area of greenhouse': 3}}

【问题讨论】:

  • 你尝试了什么?您的文件看起来如何?
  • 我尝试使用 dict,我在这里看到了一些东西,但它不起作用,因为我猜我在另一部字典中有一本字典。我想创建一个新字典并将元素放在那里,但我现在不知道如何获取 str...
  • 鉴于问题中的描述,ast.literal_eval显然是要走的路。
  • @SaicharanSM 我实际上已经看到了,但我想避免任何其他进口(因为我已经有很多)。

标签: python string dictionary newline


【解决方案1】:

ast.literal_eval 函数旨在将表示为字符串的 Python 文字表达式转换为实际的 Python 数据结构。所以:

import ast

dictionary = ast.literal_eval(string)

输入中出现\n 换行符没有任何影响。

【讨论】:

  • 我使用它并且它有效。但是现在我无法从字典中获取值......我该怎么办?我已经尝试使用 get() 创建一个新字典,但没有任何效果......
  • @DianaVasconcelosFerreira:不清楚您所说的“它有效”是什么意思,然后您说您无法从字典中获取值。如果您仍然遇到问题,我建议为您遇到的下一个问题打开一个新问题。
【解决方案2】:

要以您希望的方式从文件中获取字典,您必须像保存对象一样保存它,您可以使用 python 标准库中的 pickle

import pickle
mydic = {'Greennhouse 1': {'Product': '4', 'Location of greenhouse': '2',
       'Unities of the product': 6, 'Designation': '1', 'Growth state of the
        product': '5', 'Code of wsn': 1, 'Area of greenhouse': 3}}
with open("mydic.dic","wb") as f :
    pickle.dump(mydic,f)
# later in code
with open("mydic.dic","rb") as f :
    mynewdic = pickle.load(f)
    print mynewdic

【讨论】:

    【解决方案3】:

    虽然使用ast.literal_eval比较好,根据情况可能会使用exec,他把所有代码都解释成字符串

    s = "{'Greennhouse 1': {'Product': '4', 'Location of greenhouse': '2', 'Unities of the product': 6, 'Designation': '1', 'Growth state of the product': '5', 'Code of wsn': 1, 'Area of greenhouse': 3}}\n"
    s = "d=" + s
    exec s
    print d
    

    【讨论】:

    • 在这里使用exec 是一个糟糕的建议。
    • @GregHewgill 为什么?你能告诉我为什么吗?
    • (1) 当输入来自某些外部来源时,使用exec 会使您的代码遭受注入或 DoS 攻击。 (2) 使用exec 需要另一个变量(d),即使使用一般的eval 也可以避免。 (3) 在函数中使用exec 会严重影响性能,因为它的存在会禁用编译器可以执行的许多优化。
    • @GregHewgill (1) 这要看使用的脚本如果是个人使用没有问题,有时候不要偏执 (2) 为什么?不要给出理由(3)这是真的,但有时性能并不是最重要的.....
    • (4) 为此目的有一个更好的选择 (ast.literal_eval)。
    猜你喜欢
    • 1970-01-01
    • 2016-04-10
    • 2019-11-01
    • 2014-07-06
    • 2020-10-23
    • 2018-05-19
    • 2013-03-13
    • 2017-03-23
    • 1970-01-01
    相关资源
    最近更新 更多