python - 如何在我的 json 文件中为 discord.py 命令存储各种用户?
问题描述
这是我的代码,当前的问题是它只将最新的更改保存到我的 users.json 文件中。
@commands.command()
async def command(self, ctx):
userid = ctx.message.author.id
with open('users.json', "r", encoding="utf8") as f:
userdata = json.load(f)
try:
with open('users.json', "w", encoding="utf8") as f:
userdata[str(userid)]["coins"] = userdata[str(userid)]["coins"] + 1
json.dump(userdata, f, sort_keys=True, indent=4, ensure_ascii=False)
except:
with open('users.json', "w", encoding="utf8") as f:
userdata = {}
userdata[str(userid)] = {}
userdata[str(userid)]["coins"] = 0
json.dump(userdata, f, sort_keys=True, indent=4, ensure_ascii=False)
示例:我使用命令,这是存储在文件中的内容:
{
"idnumber": {
"coins": 0
}
}
但是,如果其他人这样做,我的可变硬币将被他们的替换,只剩下:
{
"theiridnumber": {
"coins": 0
}
}
有什么修复吗?
解决方案
从您的代码看来,您使用 try-except 只是为了查看是否不存在键等。考虑到您可以使用各种字典方法等get
非常简单地执行相同操作,这种用法是非常不必要的(并且也不必要地复杂) setdefault
.
试试这个:
@commands.command()
async def command(self, ctx):
userid = str(ctx.message.author.id)
with open('users.json', "r", encoding="utf8") as f:
userdata = json.load(f)
userdata.setdefault(userid, {}) # if key exists do nothing else set as dictionary, also returns value for key
# dict.get(key, alternate) either gets the value for key or returns the alternate given
userdata[userid]["coins"] = userdata[userid].get("coins", -1) + 1
with open('users.json', "w", encoding="utf8") as f:
json.dump(userdata, f, sort_keys=True, indent=4, ensure_ascii=False)
推荐阅读
- mysql - MySQL查询中基于字段值升序但同时混合在一起的排序
- unicode - 如何使用 fontforge 将非标准字体重新编码为 unicode
- node.js - 为什么 EC 密钥被视为 JWT 和 JWK 的有效 RSA 密钥?
- rest - 从 Power BI Desktop 向 Algorithmia API 发送发布请求
- wordpress - WordPress 的 wpcli 使用 http 而不是 https 进行插件更新
- python - 在单词末尾的 20 个字符后在字符串中创建换行符,Python
- wpf - 如何将 XamlDebuggingInformation MSBuild 属性添加到 CsProj?
- rdlc - RDLC导出的表在excel表c#中右对齐
- flutter - 输入'列表
- python - Python中不均匀时间序列数据的FFT