discord.py - Отправка файла без создания файла на моем компьютере? - PullRequest
1 голос
/ 14 июня 2019

Итак, у меня есть файл JSON, назовем его my_file.json, который содержит некоторую информацию:

[
   {
      "user": 0,
      "infos": []
   },
   {
      "user": 1,
      "infos": []
   }
]

В моем BOT я хочу создать функцию для доступа к "infos" идентификатора пользователя:

import json

@bot.command()
async def getinfo(ctx, *, user_id):
    user_id = int(user_id)
    with open("my_file.json") as f:
        for _ in json.load(f):
            if _["user"] == user_id:
                # HERE I WANT TO SEND THE CONTENTS OF "infos" OF THE 
                # CORRESPONDING USER ID IN A FILE, EACH LIST ITEM SEPERATED BY 
                # A NEWLINE

Итак, я хочу, чтобы BOT отправил файл, содержащий все элементы списка "infos" соответствующего идентификатора пользователя, каждый из которых разделен новой строкой, но я не хочу, чтобы файл был сохранен на моем компьютере. , Это возможно?

Ответы [ 2 ]

2 голосов
/ 14 июня 2019

Это возможно! Ключ использует StringIO вместо обычного файла.

Решение

from os import linesep
import io
import json
from discord import File


@bot.command()
async def getinfo(ctx, *, user_id):
    user_id = int(user_id)
    with open("my_file.json") as f:
        for _ in json.load(f):
            if _["user"] == user_id:
                f = io.StringIO(linesep.join(_["info"]))
                await ctx.channel.send(content="info", file=File(fp=f, filename="user_info.txt"))

Sidenotes

Ваша структура данных может быть неправильной, если вы можете организовать данные таким образом в файле json:

{
    "0": {"info": []},
    "1": {"info": []},
    ...
}

Тогда решение вашей проблемы проще и быстрее кодировать, потому что, помещая ваших пользователей в словарь, индексируемый по их идентификаторам, вам не придется перебирать список, чтобы найти нужного пользователя:

from os import linesep
import io
import json
from discord import File


@bot.command()
async def getinfo(ctx, *, user_id):
    with open("my_file.json") as f:
        users = json.load(f)
        if user_id in users:
            f = io.StringIO(linesep.join(users[user_id]["info"]))
            await ctx.channel.send(content="info", file=File(fp=f, filename="user_info.txt"))

EDIT1 : использовать строку в качестве ключей вместо int в решении sidenote

EDIT2 : добавлено \ r \ n, чтобы иметь функциональные переводы строк в Windows

EDIT3 : теперь используется os.linesep для получения функциональных разрывов строк в каждой ОС

2 голосов
/ 14 июня 2019
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...