Есть ли способ сделать таблицу лидеров с несколькими файлами JSON? - PullRequest
0 голосов
/ 18 января 2019

в моей текущей команде я получаю таблицу лидеров из одного json-файла с именем users.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' стало несколько 'profile / {}. Json'.format (ctx.message.author.id)
Теперь внутри папки profile есть несколько json-файлов каждого пользователя с соответствующим xp ​​вместо одного json-файла. Я хотел бы создать таблицу лидеров, используя несколько файлов JSON, а не один, используя мой код, что я могу сделать?
Полные ответы, пожалуйста, если вам нужно больше данных, скажите, пожалуйста, и я отредактирую вопрос

1 Ответ

0 голосов
/ 18 января 2019

Вместо открытия и загрузки одного файла выполните итерации по всем именам файлов в каталоге 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() вместо объединения строк с + =
...