如何使用PYTHON 3的子字符串格式化JSON项OrderedDic转储
我正在尝试转换一个Json文件如何使用PYTHON 3的子字符串格式化JSON项OrderedDic转储,python,json,python-3.x,csv,ordereddict,Python,Json,Python 3.x,Csv,Ordereddict,我正在尝试转换一个Json文件 { # "item_1":"value_11", # "item_2":"value_12", # "item_3":"value_13", # "item_4":["sub_value_14", "sub_value_15"], # "item_5":{ # "sub_item_1":"sub_item_value_11", # "sub_item_2":["sub_item_value_12", "sub_item_
{
# "item_1":"value_11",
# "item_2":"value_12",
# "item_3":"value_13",
# "item_4":["sub_value_14", "sub_value_15"],
# "item_5":{
# "sub_item_1":"sub_item_value_11",
# "sub_item_2":["sub_item_value_12", "sub_item_value_13"]
# }
# }
对于类似于以下内容的内容:
{
# "node_item_1":"value_11",
# "node_item_2":"value_12",
# "node_item_3":"value_13",
# "node_item_4_0":"sub_value_14",
# "node_item_4_1":"sub_value_15",
# "node_item_5_sub_item_1":"sub_item_value_11",
# "node_item_5_sub_item_2_0":"sub_item_value_12",
# "node_item_5_sub_item_2_0":"sub_item_value_13"
# }
我知道在转换为CSV时,您无法保持Json文件的顺序。我正在考虑通过将JSON数据加载到OrderedDic对象(这会导致按照输入文档列出它们的顺序添加它们)来解决问题。但是,我对处理JSON文件以及OrderedDic函数还不熟悉
要将项目拆分为我使用的子组,请执行以下操作:
def reduce_item(key, value):
global reduced_item
#Reduction Condition 1
if type(value) is list:
i=0
for sub_item in value:
reduce_item(key+'_'+to_string(i), sub_item)
i=i+1
#Reduction Condition 2
elif type(value) is dict:
sub_keys = value.keys()
for sub_key in sub_keys:
reduce_item(key+'_'+to_string(sub_key), value[sub_key])
#Base Condition
else:
reduced_item[to_string(key)] = to_string(value)
但是如何使用orderedDic和上述代码来显示此输出:
{
# "node_item_1":"value_11",
# "node_item_2":"value_12",
# "node_item_3":"value_13",
# "node_item_4_0":"sub_value_14",
# "node_item_4_1":"sub_value_15",
# "node_item_5_sub_item_1":"sub_item_value_11",
# "node_item_5_sub_item_2_0":"sub_item_value_12",
# "node_item_5_sub_item_2_0":"sub_item_value_13"
# }
我也有下面的代码,但它不会根据上面子字符串代码的条件将每个代码拆分为子组:
import json
from collections import OrderedDict
with open("/home/file/official.json", 'r') as fp:
metrics_types = json.load(fp, object_pairs_hook=OrderedDict)
print(metrics_types)
这表明:
有什么建议吗?您可以使用一个函数来迭代给定的dict或列表项,并合并递归调用的dict输出中的键:
def flatten(d):
if not isinstance(d, (dict, list)):
return d
out = {}
for k, v in d.items() if isinstance(d, dict) else enumerate(d):
f = flatten(v)
if isinstance(f, dict):
out.update({'%s_%s' % (k, i): s for i, s in f.items()})
else:
out[k] = f
return out
因此,鉴于:
d = {
"item_1":"value_11",
"item_2":"value_12",
"item_3":"value_13",
"item_4":["sub_value_14", "sub_value_15"],
"item_5":{
"sub_item_1":"sub_item_value_11",
"sub_item_2":["sub_item_value_12", "sub_item_value_13"]
}
}
展平(d)
返回:
{'item_1': 'value_11',
'item_2': 'value_12',
'item_3': 'value_13',
'item_4_0': 'sub_value_14',
'item_4_1': 'sub_value_15',
'item_5_sub_item_1': 'sub_item_value_11',
'item_5_sub_item_2_0': 'sub_item_value_12',
'item_5_sub_item_2_1': 'sub_item_value_13'}
以上假设您使用的是Python 3.7或更高版本,其中dict键保证是有序的。如果您使用的是早期版本,则可以使用
OrderedDict
代替常规dict。的顺序与上述相同。首先定义函数,为dictd
指定一个值,然后调用flatte(d)
。