首页 > 解决方案 > 如何在我的 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
    }
}

有什么修复吗?

标签: pythonjsondiscord.py-rewrite

解决方案


从您的代码看来,您使用 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)

推荐阅读