这是我要开始工作的python discord机器人。有一个单独的文件,名为users.json,用于保存数据,但是userid,经验和级别没有更新,而是反复添加。
试图在多个点上打印出其ID,它们都显示相同的ID。 从头开始几次,但仍然存在相同的问题。
@client.event
async def on_message(message):
with open('users.json', 'r') as g:
users = json.load(g)
await update_data(users, message.author)
await add_experience(users, message.author, 5)
await level_up(users, message.author, message.channel)
with open('users.json', 'w') as f:
json.dump(users, f)
async def update_data(users, user):
if not user.id in users:
users[user.id] = {}
users[user.id]['experience'] = 0
users[user.id]['level'] = 1
结果在users.json中:
{"162634647XXXXXXXXX": {"experience": 5, "level": 1}}
预期结果:数据(经验,水平)得到更新 实际结果:将相同的数据放入两次
答案 0 :(得分:0)
在我看来,多个on_message
调用正在同时处理,因此JSON被两次写入文件。
如果您对来自同一用户的多条消息有一定的保护(例如,每条消息都有某种确认),那么您可以只锁定打开文件的部分即可逃脱。否则,整个on_message
主体将需要位于关键部分,以防止事物进入不一致状态。
另一种可能性是,如果您的密钥不是字符串,则可能会误以为JSON密钥始终是字符串,因此往返JSON不会保留非字符串字典密钥(例如{{ 1}}编码为{42: 'foo'}
,然后解码为{"42": "foo"}
)。在这种情况下,仅使用字符串键可能是最容易的,尽管将其转换为字符串以转储为JSON并从JSON加载时解析为int也很合理。