Как редактировать закодированный файл json в Python

#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 и переписать файл, и это сработало