将新数据追加到 JSON



我正在努力将新数据附加到 JSON 中。我只想从 API 调用 JSON 数据,并将其放入"匹配"下的 JSON 文件中。我正在创建一个包含以下内容的空白 JSON 文件,然后从那里开始。

{
"matches": [
]
}

这是我的代码,尽管我怀疑只有最后一行很重要:

print ("No records found...n Creating new match history bank.")
file_handle = open(all_matches_index, "w+")
file_handle.write('{n    "matches": [n    ]n}')
for game_id in game_ids:
full_match_data = watcher.match.by_id(my_region, game_id)
#this is the problem line:
file_handle.write(json.dumps({"matches" : full_match_data }, sort_keys=True, indent = 4, separators=(',', ': ')))

我已经尝试了一连串不同的解决方案,但网上似乎没有任何地方可以解决这个问题,或者至少我不明白我在读什么。我知道这是一个简单的问题,但我无法解决它。

我尝试过的一些例子:

file_handle.write(json.dumps(full_match_data["matches"], sort_keys=True, indent = 4, separators=(',', ': ')))
file_handle["matches"].write(json.dumps(full_match_data, sort_keys=True, indent = 4, separators=(',', ': ')))
file_handle["matches"] = {**full_match_data, file_handle["matches"] sort_keys=True, indent = 4, separators=(',', ': ')))}
file_handle.write(json.dumps({"matches" : [full_match_data]}, sort_keys=True, indent = 4, separators=(',', ': ')))
file_handle.write(json.dumps(["matches" {full_match_data}], sort_keys=True, indent = 4, separators=(',', ': ')))

Edit 1:根据Pranav Hosangadi的回应进行更改,

首先,感谢您的回复,它包含的信息远远超过简单的修复程序,这确实对我的学习有所帮助。

我更改了我的代码,使其现在如下所示:

file_handle = open(all_matches_index, "w+")
file_handle.write('{n    "matches": [n    ]n}')
file_handle.close()

matches = []
for game_id in game_ids:
full_match_data = watcher.match.by_id(my_region, game_id)
matches.append(full_match_data)
with open(all_matches_index, "w") as file_handle:
json.dump(file_handle, {"matches": matches})

file_handle.close

不幸的是,它不起作用。它似乎考虑了很长一段时间(作为英特尔奔腾),然后返回一个空文件?

第二次运行它会填充文件:

{
"matches": [
]
}

你能告诉我哪里出错了吗?

一旦我让它工作,我将切换到pythonic的方式。非常感谢。

为什么每次从 API 获取结果时都写入文件?只需将新full_match_data附加到列表中,并在拥有所有内容后编写一次即可。另请注意,json.dump可以直接写入文件句柄,无需dumps字符串,然后将该字符串写入文件。

matches = []
for game_id in game_ids:
full_match_data = watcher.match.by_id(my_region, game_id)
matches.append(full_match_data)
with open(all_matches_index, "w") as file_handle:
json.dump({"matches": matches}, file_handle)

你可以用列表理解来替换循环,以获得更pythonic的方式:

matches = [watcher.match.by_id(my_region, game_id) for game_id in game_ids]

Re. 有问题的编辑:

我原来的答案有误。json.dump期望json.dump(data, file_handle).请参阅更新的答案。

<小时 />
file_handle = open(all_matches_index, "w+")
file_handle.write('{n    "matches": [n    ]n}')
file_handle.close()

代码的这一部分是不必要的。它所做的只是写入一个空文件。稍后代码中的with...块无论如何都应该覆盖它。

<小时 />
matches = []
for game_id in game_ids:
full_match_data = watcher.match.by_id(my_region, game_id)
matches.append(full_match_data)

这是创建列表的部分

<小时 />
with open(all_matches_index, "w") as file_handle:
json.dump({"matches": matches}, file_handle)

这是将数据写入文件的部分。使用with会创建一个上下文管理器,该管理器会在with块结束后自动为您关闭文件。您可以在网络上找到很多信息。

<小时 />
file_handle.close

这是 (a) 不必要的,因为上下文管理器无论如何都处理了关闭文件,以及 (b) 错误,因为您需要调用函数,所以file_handle.close()就像您之前所做的那样。

当你在python中加载一个JSON对象时,它通常只是一个字典。您可以像向字典添加数据一样将数据添加到 JSON。在我看来,您希望所有匹配项都在最终文件中的键matches下。如果是这种情况,您可以创建所有匹配项的列表或字典,然后将它们添加到 matches 键下,如下所示

match_dict= {'match_1':match_1,'match_2':match_2,...,'match_n':match_n}
matches={'matches':match_dict}

如果要使用现有 JSON 文件执行此操作,只需使用 JSON 包读取该文件,然后执行上述操作,并在最后保存该文件。

相关内容

  • 没有找到相关文章

最新更新