有没有办法制作包含多个json文件的页首横幅?

时间:2019-01-17 21:15:27

标签: python json discord discord.py leaderboard

在我当前的命令中,我从一个名为 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文件的排行榜的方法,我该怎么办?
请完整回答,如果您需要更多数据,请告诉我,我将编辑问题

1 个答案:

答案 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()而不是使用+ =
  • 连接字符串