微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将新数据附加到JSON

如何解决将新数据附加到JSON

我正在努力将新数据附加到JSON。我只是想从API调用JSON数据,然后将其放入“ matches”下的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"],': ')))

file_handle["matches"].write(json.dumps(full_match_data,': ')))

file_handle["matches"] = {**full_match_data,file_handle["matches"] sort_keys=True,': ')))}

file_handle.write(json.dumps({"matches" : [full_match_data]},': ')))

file_handle.write(json.dumps(["matches" {full_match_data}],': ')))

编辑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)

您可以使用列表解析替换循环,以使用更多的Python方式:

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,file_handle)

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


    file_handle.close

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

,

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。