Python 2.6如何将此字符串转换为dict?

时间:2016-12-02 05:42:45

标签: python string python-2.6

str = "{ u'source_ip',  u'127.0.0.1'}, { u'db_ip',  u'43.53.696.23'}, { u'db_port',  u'3306'}, { u'user_name',  u'uz,ifls'} "

如何将此字符串转换为dict?

"source_ip":"127.0.0.1","db_ip":"43.53.696.23","db_port":"3306"

我试过了

str = dict(str)

但它无效

3 个答案:

答案 0 :(得分:4)

这些片段看起来像python集。如果你通过ast.literal_eval运行它们会得到一些接近的东西,但由于没有订购集合,你无法保证两个项目中的哪一个是关键,哪个是值。这是一个彻头彻尾的黑客攻击,但是我用parens替换了花括号,所以它们看起来更像元组,并从那里制作了字典。

>>> mystr = "{ u'source_ip',  u'127.0.0.1'}, { u'db_ip',  u'43.53.696.23'}, { u'db_port',  u'3306'}, { u'user_name',  u'uz,ifls'} "
>>> mystr = mystr.replace('{', '(').replace('}', ')')
>>> import ast
>>> mydict = dict(ast.literal_eval(mystr))
>>> mydict
{u'user_name': u'uz,ifls', u'db_port': u'3306', u'source_ip': u'127.0.0.1', u'db_ip': u'43.53.696.23'}
>>> 

答案 1 :(得分:1)

我不知道你是否想将整个输入字符串转换成字典,因为你输出的输出让我感到困惑。 否则,我的答案将为您提供输出,如您想要的第二个高亮文本格式:

a = "{ u'source_ip',  u'127.0.0.1'}, { u'db_ip',  u'43.53.696.23'}, { u'db_port',  u'3306'}, { u'user_name',  u'uz,ifls'} "
c = a.replace("{", '').replace("}","").replace(" u'", '').replace("'", '').replace(" ", "").split(",")
d, j = {}, 0
for i in range(len(c)):
    if j +2 > len(c):
        break
    if c[j] == "user_name":
        #d[c[j]] = "uz,ifls" #uncomment this line to have a complete dict
        continue
    d[c[j]] = c[j+1]
    j += 2

输出:

print d 
{'db_port': '3306', 'source_ip': '127.0.0.1', 'db_ip': '43.53.696.23'}
print type(d)
<type 'dict'>

如果你想要一个字符串的完整字典取消注释上面注释的行,输出将是:

print d
{'user_name': 'uz,ifls', 'db_port': '3306', 'source_ip': '127.0.0.1', 'db_ip': '43.53.696.23'}
print type(d)
<type 'dict'>

答案 2 :(得分:1)

几点:

  • 顶层数据结构实际上是一个元组(因为在Python中,1, 2, 3(1, 2, 3)相同。
  • 正如其他人所指出的那样,内部数据结构是设置文字,不是有序的。
  • 设置文字在Python 2.6中实现,但在ast.literal_eval函数中实现,arguably a bug
  • 事实证明,您可以制作自己的自定义literal_eval功能并使其达到您想要的效果。
from _ast import *
from ast import *

# This is mostly copied from `ast.py` in your Python source.

def literal_eval(node_or_string):
    """
    Safely evaluate an expression node or a string containing a Python
    expression.  The string or node provided may only consist of the following
    Python literal structures: strings, bytes, numbers, tuples, lists, dicts,
    sets, booleans, and None.
    """
    if isinstance(node_or_string, str):
        node_or_string = parse(node_or_string, mode='eval')
    if isinstance(node_or_string, Expression):
        node_or_string = node_or_string.body
    def _convert(node):
        if isinstance(node, (Str)):
            return node.s
        elif isinstance(node, Tuple):
            return tuple(map(_convert, node.elts))
        elif isinstance(node, Set):
            # ** This is the interesting change.. when
            # we see a set literal, we return a tuple.
            return tuple(map(_convert, node.elts))
        elif isinstance(node, Dict):
            return dict((_convert(k), _convert(v)) for k, v
                        in zip(node.keys, node.values))
        raise ValueError('malformed node or string: ' + repr(node))
    return _convert(node_or_string)

然后我们可以这样做:

>>> s = "{ u'source_ip',  u'127.0.0.1'}, { u'db_ip',  u'43.53.696.23'}, { u'db_port',  u'3306'}, { u'user_name',  u'uz,ifls'} "
>>> dict(literal_eval(s))
{u'user_name': u'uz,ifls', u'db_port': u'3306', u'source_ip': u'127.0.0.1', u'db_ip': u'43.53.696.23'}