我需要从json文件中获取字典或词典的特定列表中的某些值,并将其仅转换为一个键,即值作为字符串值。
像这样的文件示例。
1)首先,我将所有值复制到变量中。
var fileA =
[{'key1': 'value1',
'key2': 'value2',
'key3': 'value3',
'...': '...',
'keyN': {'keyNN': [{'key_a': 'value_a',
'key_b': 'value_b'},
{'key_AA': 'value_AA'}]}},
{'key1': 'value1',
'key2': 'value2',
'key3': 'value3',
'...' :'...',
'keyN': {'keyNN': {'key_a': 'value_a',
'key_b': 'key_b'}}},
....]
2)在评估两种情况之后:第一种情况是类型是 dict 还是 list ,因为“ keyN”是字典,“ keyNN”是字典,但是第一句话“ key_a”是词典列表的一部分,第二句话是其他词典。
如果我将此代码放入函数中并显示来自迭代的错误消息,则我手动解决了这一部分。
如果结果是字典,我会打印值并存储在变量中。
if type(fileA['keyN']['keyNN']) is dict:
X= fileA['keyN']['keyNN'].copy()
del (fileA['keyN'])
X.popitem()
X.update([fileA])
print(X)
TypeError: string indices must be integers
在第二种情况下,如果type是列表:
for index in fileA['keyN']['keyNN']:
for key in index:
new_values = ("{}={}".format(key, index[key]))
print(new_values)
print(type(new_values))
打印结果
key_a=value_a
key_b=value_b
key_c=value_c
<class 'str'>
3)想法是使用函数popitem()和update()。
fileA[0].popitem()
fileA[0].update('keyN'= new_values)
结果
[{'key1': 'value1',
'key2': 'value2',
'key3': 'value3',
'...': '...',
'keyN': 'key_AA=value_AA'},
但是预期结果应该是:
[{'key1': 'value1',
'key2': 'value2',
'key3': 'value3',
'...': '...',
'keyN': 'key_a=value_a,
key_b=value_b,
key_AA=value_AA'},
{'key1': 'value1',
'key2': 'value2',
'key3': 'value3',
'...' :'...',
'keyN': 'key_a=value_a,
key_b=key_b'}},
....]
如最后一个示例所示,keyN是主键,所有嵌套的键和值都包含在一个唯一的字符串(keyN的值)中。
我无法使用新值存储和更新主键参数,我尝试使用popitem并在更新后使用
。因此,经过几个小时之后,请检查所有选项,我会寻求您的帮助。 谢谢
答案 0 :(得分:0)
我解决了一部分问题,开始工作,然后又出错了。
for met in fileA:
if met.get('keyN') is not None:
if type(met['keyN']['keyNN']) is dict:
new_values = []
for key, value in met['keyN']['keyNN'].items():
new_values.append("{}={}".format(key,value))
new_str = ""
for i in new_values:
new_str = ";".join(str(x) for x in new_values)
met['keyN'].popitem()
met.update(keyN= new_str)
elif type(met['keyN']['keyNN']) is list:
new_values = []
for index in met['keyN']['keyNN']:
for key in index:
new_values.append("{}={}".format(key, index[key]))
new_str = ""
for i in new_values:
new_str = ";".join(str(x) for x in new_values)
met['keyN'].popitem()
met.update(keyN= new_str)
***
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-18-600979395481> in <module>
1 for met in keyN:
2 if met.get('keyN') is not None:
----> 3 if type(met['keyN']['keyNN']) is dict:
4 new_values = []
5 for key, value in met['keyN']['keyNN'].items():
TypeError: string indices must be integers