在我当前的命令中,我从一个名为 users.json 的json文件获得了排行榜,该文件存储了来自多个用户的多个XP:
@bot.command(pass_context=True)
async def top(ctx):
with open('profile/users.json', 'r') as fp:
users = json.load(fp)
lb = [(member, users[member.id].get('xp')) for member in ctx.message.server.members if member.id in users]
lb.sort(key=lambda x: x[1], reverse=True)
但是,我更改了命令,让每个人将XP存储在单独的json文件中:
'profile / users.json'曾经变成了几个<strong>'profile / {}。json'.format(ctx.message.author.id)
现在,在 profile 文件夹中,每个用户有几个json文件及其各自的xp,而不是单个json文件。
我想一种使用我的代码同时使用多个json文件而不是一个使用json文件的排行榜的方法,我该怎么办?
请完整回答,如果您需要更多数据,请告诉我,我将编辑问题
答案 0 :(得分:1)
而不是打开和加载一个文件,而是遍历profile
目录中的所有文件名。加载每个文件并将其存储在列表中以备后用。
import glob
import json
filenames_of_all_users = glob.glob("profile/*.json")
users = []
for filename in filenames_of_all_users:
with open(filename) as file:
users.append(json.load(file))
users.sort(key=lambda user: user["xp"], reverse=True)
output = ["'''"]
for i, user in enumerate(users, 1):
output.append(f"{i}. {user['name']}: {user['xp']} XP")
if i == 20:
break
output.append("'''")
result = "\n".join(output)
print(result)
我在这里进行了其他一些更改,这些更改对于解决方案不是必需的,但是更惯用和/或更有效:
enumerate
代替在for循环中手动跟踪索引join()
而不是使用+ =