【问题标题】:Python convert string object into dictionaryPython将字符串对象转换为字典
【发布时间】:2011-03-16 00:41:07
【问题描述】:

我一直在努力构建一个复杂的数据结构,它会返回一个字典。目前该类返回表单的字符串对象

{
   cset : x,    
   b1   : y,
   b2   : z,    
   dep  : {    
              cset : x1,
              b1   : y1,    
              b2   : z1,    
              dep  : {    
                         cset : x2,     
                         b1   : y2,    
                         b2   : z2,    
                         dep  : <same as above.it  recurses few more levels>                         
                         ...  
                     }
        }
    }

我想将整个字符串对象转换成字典。 我读过一篇文章使用pickle 模块,但我不想将它序列化为某个文件并使用它。

参考:http://bytes.com/topic/python/answers/36059-convert-dictionary-string-vice-versa

如果可能的话,我正在寻找其他更简洁的方法。

很高兴知道任何这样的方式。

【问题讨论】:

  • 专业提示 #1:返回并接受您之前问题的答案,以免看起来像个混蛋。 (复选标记位于最能回答您的问题的回复旁边)
  • @Wayne :我做到了,之前不知道,谢谢

标签: python string dictionary


【解决方案1】:

如果您足够小心以保持代码有效python,您可以使用eval

eval(yourlongstring)

【讨论】:

    【解决方案2】:

    您可能确实想使用 Pickle:

    http://docs.python.org/library/pickle.html#pickle.dumps

    它还可以将值作为字符串返回,而不是写入文件。

    【讨论】:

    • 如果可能,最好使用标准库!
    • 现在不是标准库的 ast 模块部分吗?
    【解决方案3】:

    这是实际的数据格式吗?你有灵活性吗?

    它非常接近 JSON,这是一种标准数据格式,Python 具有用于读取和写入(序列化和反序列化)的本机库。但是,要使其成为有效的 JSON,键和值都需要用引号括起来:

    "cset" : "x",
    "b1"   : "y"
    

    等等。

    【讨论】:

      【解决方案4】:

      不要使用eval。如果您确定字符串将始终包含有效的 Python dict,请使用 ast.literal_eval。这很像eval,但它只评估表达式是否是有效的dictlist 等,如果不是则抛出异常。这比尝试在运行时评估可能包含任意代码的字符串安全得多。

      来自docs

      安全地评估表达式节点或 一个包含 Python 的字符串 表达。字符串或节点 提供的可能只包括 以下 Python 文字结构: 字符串、数字、元组、列表、 字典、布尔值和无。

      这可用于安全评估 包含 Python 表达式的字符串 来自不受信任的来源 需要自己解析值。

      代码示例:

      >>> import ast
      >>> ast.literal_eval("1+1")
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
        File "/usr/lib/python2.6/ast.py", line 68, in literal_eval
          return _convert(node_or_string)
        File "/usr/lib/python2.6/ast.py", line 67, in _convert
          raise ValueError('malformed string')
      ValueError: malformed string
      >>> ast.literal_eval("\"1+1\"")
      '1+1'
      >>> ast.literal_eval("{'a': 2, 'b': 3, 3:'xyz'}")
      {'a': 2, 3: 'xyz', 'b': 3}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-27
        • 1970-01-01
        • 2018-05-19
        • 2013-03-13
        • 2017-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多