python - 我想更新字典/json 键而不是附加一个新键?
问题描述
好的,所以我正在使用 discord.py 和 JSON,并且我正在尝试制作票务柜台,客户端拒绝使用数据库,所以我必须使用 JSON。但是每次代码更新文件时,它都会创建第二个密钥,然后使用该密钥而不是第一个。如果有人想看到它在行动中发生,请给我朋友 (Jpac14#8237),我会告诉你会发生什么。我还将附上我的代码和 JSON 文件。
您还认为我可以为此使用您的收藏模块吗?
代码:
from discord.ext import commands
import discord
import json
class TicketSystem(commands.Cog):
def __init__(self, bot):
self.bot = bot
self.create_ticket_msgs = []
@commands.Cog.listener()
async def on_reaction_add(self, reaction, user):
for create_ticket_msg in self.create_ticket_msgs:
if reaction.message.id == create_ticket_msg.id and user != self.bot.user:
await reaction.message.channel.send(f"{user} reacted")
await reaction.message.remove_reaction("", user)
ticket_counter_dict = {}
try:
with open("json/ticket_counter.json", "r") as ticket_counter_json:
ticket_counter_dict = json.load(ticket_counter_json)
except json.JSONDecodeError:
print("JSONDecodeError")
current_ticket_counter = ticket_counter_dict.get(str(reaction.message.guild.id))
if current_ticket_counter == None:
current_ticket_counter = 1
ticket_catergory = discord.utils.get(reaction.message.guild.categories, name="Tickets")
if reaction.message.guild.id == 660156957486874645:
support_team_role = discord.utils.get(reaction.message.guild.roles, name="Staff")
else:
support_team_role = discord.utils.get(reaction.message.guild.roles, name="Support")
ticket_channel_overwrites = {
support_team_role: discord.PermissionOverwrite(read_messages=True),
user: discord.PermissionOverwrite(read_messages=True),
reaction.message.guild.default_role: discord.PermissionOverwrite(read_messages=False)
}
users_ticket_channel = await ticket_catergory.create_text_channel(f"ticket-{current_ticket_counter}", overwrites=ticket_channel_overwrites)
current_ticket_counter += 1
ticket_counter_dict.update({reaction.message.guild.id: current_ticket_counter})
with open("json/ticket_counter.json", "w") as ticket_counter_json:
json.dump(ticket_counter_dict, ticket_counter_json)
embedMessage = discord.Embed(description="Support will be with you shortly.\nTo close the ticket type ?close", color=discord.colour.Colour.green())
embedMessage.set_footer(text=f"Created By Nexus Developments - https://discord.gg/YmdugDf", icon_url="https://i.imgur.com/MRBsIpe.png")
await users_ticket_channel.send(embed=embedMessage)
@commands.command(name="ticketmsg")
async def send_create_ticket_msg(self, ctx, channel: discord.TextChannel):
embedMessage = discord.Embed(title="Create A Ticket", description="To create a ticket react with ", timestamp=ctx.message.created_at, color=discord.colour.Colour.green())
embedMessage.set_footer(text=f"Created By Nexus Developments - https://discord.gg/YmdugDf", icon_url="https://i.imgur.com/MRBsIpe.png")
create_ticket_msg = await channel.send(embed=embedMessage)
await create_ticket_msg.add_reaction("")
self.create_ticket_msgs.append(create_ticket_msg)
def setup(bot):
bot.add_cog(TicketSystem(bot))
JSON文件:
{"665930890039394305": 6, "665930890039394305": 7}
解决方案
reaction.message.guild.id
是一个int
。
编写时ticket_counter_dict.update({reaction.message.guild.id: current_ticket_counter})
,您会在 dict 中创建一个新int
键,该键不会覆盖加载文件str
时存在的键。json
看这个例子:
import json
d = {1: 'a', '1': 'b'}
json.dumps(d)
>>> '{"1": "b", "1": "a"}'
dict 可以同时保存1
和'1'
作为键,因为它们是不同的对象。但是 json 序列化会将两者都变成字符串,因为 json 使用字符串作为键。
我认为 json 模块还有改进的空间,因为它似乎没有检查字符串化的键是否都是唯一的。
您可以通过确保使用字符串作为 dict 中的键来修复代码:
ticket_counter_dict.update({str(reaction.message.guild.id): current_ticket_counter})
推荐阅读
- c++ - 在 C 和 ubuntu 中为后台程序选择键盘输入
- javascript - 使用 JQuery 切换内联样式 - 显示和溢出
- apache-spark - Spark Sql 执行是否使用线程本地作业组?
- angular - 在角度项目中上传图像的更好方法是什么?
- csv - 在 Jmeter 中,来自 CSV 文件的数据不是读取
- reactjs - 应用部署到生产服务器时返回 404
- c# - 如何在 ASP.NET MVC 的编辑视图中的下拉列表中填充值
- java - Java 反射:高负载时的 NoSuchMethodException
- jquery - 使用 Jquery SerializeArray() 获取 JSON 键值对
- php - 文件下载给出警报消息而不是下载它