将包含转义符的字符串转换为di

2024-10-03 11:19:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要将表示dict的python字符串转换为python dict。该字符串可能包含任何有效的dict表示,包括windows样式的路径(带反斜杠),例如

mystring = u'{"baselocaldir":"c:\\tmp\\SrcTmp\\RepManager"}'

我需要一个通用的str来dict convert函数,所以这只是一个源字符串的例子,它不起作用。源字符串可能来自外部源。最好是python2/3兼容的解决方案。在

我已经试过给出的答案:

在json.loads不起作用(即使我将字符串重新格式化为json语法):引发异常

在ast.literal_评估不起作用:在本例中,它在结果中放置一个制表符

评估:结果与ast.literal_评估在


Tags: 字符串路径jsonwindows样式asttmpdict
3条回答

我的(也许不是最优雅的)解决方案:

但它适用于python2、python3以及unicode字符串中的unicode字符:


text_type = None
if PY2:
    string_types = basestring
    text_type = unicode
else:
    string_types = text_type = str

def DictUnescaceBackslash(oDict):
    for key, value in iteritems(oDict):
        if isinstance(value, dict):
            DictUnescaceBackslash(value)
        elif isinstance(value, string_types):
            oDict[key]=oDict[key].replace("***BaCkSlAsH***","\\")
        elif isinstance(value, list):
           for elem in value:
                DictUnescaceBackslash(elem)

mystring = u'{"baselocaldir":"c:\\tmp\\SrcTmp\\RepManager"}'
uString2 = mystring.replace("\\","***BaCkSlAsH***")
dDict    = ast.literal_eval(uString2)
DictUnescaceBackslash(dDict)


我会对字符串进行修改,将“c:”替换为原始字符串文本r'c:'

mystring = u'{"baselocaldir": "c:\\tmp\\SrcTmp\\RepManager"}'.replace('"c:', 'r"c:') 
_dict = eval(mystring)
_dict

结果:

^{pr2}$

反斜杠很容易更改,不需要在后面加上双斜杠:

mystring = u'{"baselocaldir":"c:\\tmp\\SrcTmp\\RepManager"}'
test = repr(mystring)[1:-1] 
print(test)

# convert to dictionary
my_dict = json.loads(test)
print('dict key "baselocaldir" = ', my_dict["baselocaldir"])

输出:

^{pr2}$

Edit2:显然,仅使用repr()是不够的,这就是为什么我编辑了我的答案以使用regex并将所有\替换为\\,代码如下:

import re, json
mystring = u'{"baselocaldir":"c:\tmp\SrcTmp\RepManager"}'

test = re.sub(r'(?<=[^\\])\\(?=[^\\])', r'\\\\', repr(mystring)[1:-1])
print(test)

# convert to dictionary
my_dict = json.loads(test)
print('dict key "baselocaldir" = ', my_dict["baselocaldir"])

输出:

^{pr2}$

以前的答案,这是不够的 编辑: 将字符串转换为原始字符串的简单方法是使用repr()或{}

这是一个一步到位的解决方案,9年前的积分是:

mystring = u'{"baselocaldir":"c:\tmp\SrcTmp\RepManager"}'

raw_str = "%r"%mystring
rep_str= repr(mystring)

print('original string = ', mystring)
print('Raw string = ', raw_str)
print('rep string = ', rep_str)

输出:

original string =  {"baselocaldir":"c:  mp\SrcTmp\RepManager"}
Raw string =  '{"baselocaldir":"c:\tmp\\SrcTmp\\RepManager"}'
rep string =  '{"baselocaldir":"c:\tmp\\SrcTmp\\RepManager"}'

相关问题 更多 >