#python #json #encoding #discord.py
#python #json #кодирование #discord.py
Вопрос:
В настоящее время я разрабатываю Discord-бота с Python. Для сохранения данных я создал файл .tmp, в котором хранится текст данных в формате json.
Мне пришлось закодировать его, чтобы сразу записать в файл (я также выполняю некоторую проверку значений в файле).
Поскольку он закодирован, я не могу редактировать json с помощью этого кода :
emojiU = 'N{THUMBS UP SIGN}'
emojiD = 'N{THUMBS DOWN SIGN}'
cnd_Member = [member for member in ctx.guild.members if str(data['roles_id']['AmongUs']) in str(member.roles) and (str(member.status) == "online" or str(member.status) == "idle") and member.id != ctx.author.id]
tmpfile = open("my_file.tmp", "wb ", 0) #List that store connected user with a specific role
for i, member in enumerate(cnd_Member): # for connected member with the specific role
DM = discord.utils.get(client.get_all_members(), id=member.id)
Sstring = "***" Sender "***" ' veux jouer à ***' game '***.n :thumbsup: si vous êtes chaud ou :thumbsdown: si vous ne l'êtes pas'
msg = await DM.send(embed=createEbd(des=Sstring, img=imgLink)) #send DM to the member
if i == 0:
save = '{{"{}":{{"msgId":{}, "reaction":"None"}}, '.format(member.id, msg.id)
elif i == len(list(cnd_Member))-1:
save = '"{}":{{"msgId":{}, "reaction":"None"}}}}'.format(member.id, msg.id)
else :
save = '"{}":{{"msgId":{}, "reaction":"None"}}, '.format(member.id, msg.id)
await msg.add_reaction(emojiU ) #Bot add reaction to the DM message
await msg.add_reaction(emojiD) #Bot add reaction to the DM message
tmpfile.write(save.encode("utf-8")) #creating the json file with data
@client.event
async def on_reaction_add(reaction, user):
if user.id != client.user.id :
if reaction.emoji == emojiU:
tmpfile.seek(0)
rd = tmpfile.read() # Getting the content of file
binf = json.loads(rd.decode('utf-8'))
binf["{}".format(user.id)]["msgId"] = thxObj.id #Updating the json with new value
binf["{}".format(user.id)]["reaction"] = "True" #Updating the json with new value
json.dump(binf, tmpfile) #writing to file fail because it's not encoded
if reaction.emoji == emojiD:
tmpfile.seek(0)
rd = tmpfile.read() # Getting the content of file
binf = json.loads(rd.decode('utf-8'))
binf["{}".format(user.id)]["msgId"] = thxObj.id #Updating the json with new value
binf["{}".format(user.id)]["reaction"] = "False" #Updating the json with new value
json.dump(binf, tmpfile) #writing to file fail because it's not encoded
Используя json.dumps, затем кодируйте его и записывайте в файл с помощью tmpfile.запись работает, но она только добавляет данные, не редактируя существующий json в tmpfile.
Спасибо за помощь
Комментарии:
1. Ваш код больше похож на псевдокод, не могли бы вы привести пример, по крайней мере, без синтаксических ошибок?
2. Откройте новый дескриптор записи, чтобы вы могли быть уверены, что перезаписываете. Или запишите его во временный файл и поменяйте их местами.
Ответ №1:
Я нашел, как с этим справиться.
Я сохранил все данные в файле формата JSON, когда пользователь добавляет реакцию, он редактирует файл. Когда мне нужно опубликовать таблицу, она считывает файл JSON.
Закодированный или не закодированный, мне просто нужно было отредактировать json.loads
и переписать файл, и это сработало