2016-12-02 139 views
1
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'} " 

我怎麼轉換這個字符串字典?Python 2.6如何將此字符串轉換爲字典?

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

我已經試過

str = dict(str) 

,但它沒有工作

+0

是否有該字符串表示的正式規範?它看起來有點像修改過的Python 2.x的東西。 – tdelaney

+0

如果是'{'source_ip':'127.0.0.1''''',那麼你可以使用'eval()' – Prajwal

回答

4

這些碎片看起來像蟒蛇套。如果通過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

功能性和完整性 - 無論是否hacky,實用性都會勝過純粹。 – TigerhawkT3

0

我不知道是否要將整個輸入字符串轉換爲字典或不是,因爲您給出的輸出讓我困惑。 否則,我的回答能給你像你想在一個字典格式第二個加亮後文本的輸出:

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