Это возможно!
Ключ использует 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 для получения функциональных разрывов строк в каждой ОС