我有一个像这样的词典:
data = {
'key1': value1,
'key2': value2
}
现在我如何追加存储在字符串中的键值列表,如
str0 = "key3:val3, key4:val4"
or
str = "{key3:val3, key4:val4}"
进入上面的json dict?
print data.update(str)
print data.update(ast.literal_eval(str))
给出错误。
(也尝试过按键引用) 提出ValueError('格式错误的字符串')
ValueError: malformed string
答案 0 :(得分:1)
由于这些字符串不是有效的json
字符串,并且这些字符串可能具有不同的结构,因此您必须解析字符串。要解析字符串,可以使用正则表达式。如果模式好,那么它可以处理不同的字符串。举个例子:
import re
pat = re.compile(r'(\w+):(\w+)') # \w matches any alphanumeric character
str0 = "key3:val3, key4:val4"
str1 = "{key3:val3, key4:val4}"
print dict(re.findall(pat, str0))
print dict(re.findall(pat, str1))
这将为您提供输出:
{'key3': 'val3', 'key4': 'val4'}
{'key3': 'val3', 'key4': 'val4'}
您还可以使用字典的更新方法更新data
字典。等,
data.update(dict(re.findall(pat, str0)))
答案 1 :(得分:0)
str
格式不正确的JSON字符串。如果您可以使用str = "{'key3':'val3', 'key4':'val4'}"
格式生成JSON字符串,它应该可以正常工作。
>>> import ast
>>> data = {'key1': 'value1', 'key2': 'value2'}
>>> str = "{'key3':'val3', 'key4':'val4'}"
>>> data.update(ast.literal_eval(str))
>>> data
{'key3': 'val3', 'key2': 'value2', 'key1': 'value1', 'key4': 'val4'}
如果您必须坚持原始格式,则必须按照PyNEwbie's answer中的指示编写所有者解析器。
答案 2 :(得分:0)
str0 = "key3:val3, key4:val4"
or
str = "{key3:val3, key4:val4}"
这些不是格式良好的JSON字符串。 “JSONDecodeError:期望用双引号括起来的属性名称:”当用双引号括起键名时,JSON字符串是什么样的?请记住,您需要将外部单词更改为单引号
这个片段对我来说很好用:
import json
data = {
'key1': 5,
'key2': 3
}
str = '{"key3":3, "key4":2}'
foo = json.loads(str)
data.update(foo)
print(data)
>>> {'key3': 3, 'key2': 3, 'key4': 2, 'key1': 5}
答案 3 :(得分:0)
基本上,您需要对字符串应用字符串操作,以将字符串输入转换为分析所需的表单
如果您的数据结构类似
str0 = "key3:val3, key4:val4"
然后采取这种方法
for item in str0,split(','):
key,value = item.split(':')
data[key] = value
当您的输入字符串采用此格式时
str = "{key3:val3, key4:val4}"
采取这种方法
str = str.replace("{","").replace("}","")
for item in str.split(","):
key, value = item.split(':')
data[key] = value
答案 4 :(得分:0)
尝试以下方法:
import json
import ast
data = {'key1': 'value1', 'key2':'value2'}
print json.dumps(data) #stdout: {"key2": "value2", "key1": "value1"}
data_after_ast = ast.literal_eval(json.dumps(data))
print type(data_after_ast) #stdout: <type 'dict'>
因此,很明显你的str0或str格式错误引用了。
修复它:
以下代码适用于使用选项2
格式str0 for s in str0.split(','):
[key,value]=s.split(":")
data.update({key:value})
希望它能回答你的问题。