使用python在.json文件中存储数据有哪些不同的方法?

2024-05-26 09:18:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在为我的discord.py机器人开发一个警告系统。我一直很顺利,直到我意识到我不知道如何添加到文件中,而不是覆盖文件。我不想添加到文件的末尾,因为我希望它按照不和谐的协会进行分类,然后是协会成员。因此,当有人想要检查他们的警告时,它只会在调用命令的特定帮会中显示他们的警告。我的问题是,将信息存储到.json文件的所有不同方式是什么

例如:warn_list[str(ctx.guild.id)][member.id].add({stuff in here})

如示例所示,我不想知道存储aka'a''w'等的不同模式。我想知道,如果有的话,最后可以添加什么。比如.append()或者.add()。我在谷歌上搜索了一个列表,但我找不到我要找的信息。任何帮助都将不胜感激

真诚地, 杀人狂


Tags: 文件pyadd信息id警告系统分类
1条回答
网友
1楼 · 发布于 2024-05-26 09:18:31

如何添加持久化到JSON的自定义数据

您正在向字典添加数据,因此可以使用dict[key] = value添加数据,使用value = dict[key]读取数据。要添加到list的末尾,请使用append()

你和你所拥有的很接近。让我们进行重构,以保持思维清晰:

warns_for_a_user = warn_list[str(ctx.guild.id)][member.id]

我们可以直接使用这个字典来存储关于这个member.id的警告信息。我们需要一个数据结构,我认为list符合要求(或者dict)。您可能希望在这些警告中包含时间信息,而时间似乎是一个合理的排序顺序和/或主键

I want to know, if there are any, what can be added to the end

通常不直接修改.json文件。修改.json文件的唯一可靠方法是将整个内容读入内存,然后在修改后将其保存回.json

把一个.json文件想象成一张及时的照片或快照。如果场景发生了变化,你只需扔掉旧照片,再拍一张;如果状态已更新,我们只需丢弃旧的warnings.json,并创建一个新的warnings.json

步骤1:添加新字段并附加到新字段

鉴于我们有关于最新warning的信息,我们可以将其保存到用户的历史记录中:

# working with givens:
warning = { "type": "spam", "count": "20", "timestamp": 1612756912.987963 }

if not history in warns_for_a_user:
    warns_for_a_user['history'] = []
warns_for_a_user['history'].append([warning['timestamp'], warning])

您添加的这些新字段不应与任何内容冲突,因为它们是代码其他部分未知的定制字段

如果您发现将每个警告包装在时间戳中很麻烦,那是因为它是。但是,通常选择单个字段(或字段组合)作为整个对象的代表键。这有助于人们直接读取json文件,还可以简化处理逻辑

步骤2:读取新字段数据

稍后,用户希望查看其警告。以下内容每次打印一条警告(来自SO的日期时间代码):

import datetime
for epoch_time, warn in warns_for_a_user['history']:
    _datetime = datetime.datetime.fromtimestamp(epoch_time)
    _human_datetime = _datetime.strftime('%Y-%m-%d %H:%M:%S')
    print(f"{_human_datetime}: [{warn['count']}x] {warn['type']}")

输出:

2021-02-07 20:01:52: [20x] spam

支持的数据类型

JSON编码器文档有一个mapping说明如何将序列化的JSON数据转换为反序列化的python对象。注意,它将元组转换为列表

检查warnings.json

如果您遵循我的示例,您应该会看到在warnings.json中的相应用户下添加了以下内容:

{"history": [[1612756912.987963, {"count": 20, "type": "spam", "timestamp": 1612756912.987963}]]}

1方括号表示法是__getitem__()__setitem__()的语法糖

相关问题 更多 >