我有传入的JSON文件,其中包含元素[a,b,c]和一个历史记录元素,其中包含具有相同元素[a,b,c]的嵌套JSON。历史记录元素中可能有多个嵌套条目,或者一个或一个都没有,但是下面是有关数据外观的示例。这是一个示例:
{
"a": "1",
"b": "2",
"history": [
{
"a": "11",
"b": "22",
"c": "33"
},
{
"a": "111",
"b": "222",
"c": "333"
}
],
"c":"3"
}
{
"a": "a1",
"b": "b1",
"history": [
{
"a": "a12",
"b": "b12",
"c": "c12"
}
],
"c":"c1"
}
我想规范化此JSON,以便一切看起来像{"a": "111", "c": "333", "b": "222"}{"a": "111", "c": "333", "b": "222"}{"a": "1", "c": "3", "b": "2"}
我构建了一个简单的脚本,该脚本读取文件并执行json.loads()并读取“ histroy”元素。
import json
j1 = json.loads(j1)
if "history" in j1.keys():
j1_hist = j1["history"]
with open('/normalzied_json_output', 'w') as f:
for i in range(len(j1_hist)):
f.write(json.dumps(j1_hist[1]))
j1.pop('history', None)
f.write(json.dumps(j1))
基本将所有历史记录读入变量(如果存在)并打开输出文件(normalzied_json_output),并将每个嵌套的json条目读入输出文件,仅提取[a,b,c]并追加到同一文件
这在基本水平上可行,但我正在研究对其进行优化的可能性。我每天的工作量很大(十万个),我想知道是否可以在没有太多循环的情况下进行扩展。
答案 0 :(得分:0)
首先,JSON操作通常很昂贵。
您正在使用range生成数字列表,现在考虑一下,如果您输入的数组长度为10000,它将生成所有这些数字,然后对其进行迭代。
您可以删除if条件以检查“ history”键,而只需使用如下所示的get方法:
import json
with open(filename, 'r') as f:
j1= json.load(f)
with open('/normalzied_json_output', 'w') as f:
for item in j1.get("history", []):
f.write(json.dumps(item))
j1.pop('history', None)
f.write(json.dumps(j1))
顺便说一句,您的代码没有执行您想要的操作,为什么您只从历史记录中读取第一个索引值?为什么在循环内使用pop并在循环内一次又一次地写入整个文本?