Python开发Twitch Bot投票功能时JSON数据回写问题求助
问题1:投票数据回写JSON + 实时读取JSON修改的解决方案
第一步:优化JSON读写封装
不要使用全局变量传递配置,封装独立的读写函数,每次处理投票请求时主动读取最新的JSON文件内容,修改后主动回写:
import json # 读取最新投票配置 def load_poll_config(): with open("poll.json", "r", encoding="utf-8") as f: return json.load(f) # 回写修改后的投票数据 def save_poll_config(data): with open("poll.json", "w", encoding="utf-8") as f: # indent=4保持和原文件一致的格式化,ensure_ascii=False支持中文问题/选项 json.dump(data, f, indent=4, ensure_ascii=False)
你之前封装的读取函数只能拿到启动时的配置,是因为你仅在脚本初始化时调用了一次,只要每次处理投票前都调用load_poll_config就能实时感知Web端对JSON的修改。
第二步:修改vote命令逻辑,增加回写步骤
# 若需要重启Bot后仍保留用户投票记录,可将该列表存入JSON的新增字段中 poll_entrants = [] @bot.command(name="vote") async def vote(ctx): # 每次投票都读最新配置 poll_config = load_poll_config() vote_active = poll_config["poll_active"] vote_opts = poll_config["vote_options"]["options"] if ctx.author.name not in poll_entrants and vote_active: try: # 解析用户投票序号,转换为从0开始的索引 vote_index = int(ctx.message.content.split("vote ")[1]) - 1 target_opt = list(vote_opts.keys())[vote_index] # 票数+1 vote_opts[target_opt] += 1 poll_entrants.append(ctx.author.name) # 回写修改后的票数到JSON poll_config["vote_options"]["options"] = vote_opts save_poll_config(poll_config) print("投票计数成功") # 捕获参数错误、序号越界等异常 except (IndexError, ValueError, KeyError): pass else: print("投票无效:用户已参与或投票未开启")
问题2:存储格式选择建议
JSON完全适配你的使用场景,不需要更换为XML或YAML:
- JSON是所有编程语言原生支持的通用格式,你的Web管控端、Python Bot、CasparCG服务都不需要额外安装解析依赖,读写效率高
- YAML虽然可读性更高,但语法对缩进敏感,频繁手动/接口修改容易出错,且Python需要额外安装PyYAML库
- XML冗余度高、解析逻辑复杂,完全没有必要用于该轻量配置场景
如果后续投票并发量上涨(同时几十人以上投票),可以加文件锁避免读写冲突,或者更换为SQLite轻量数据库更稳妥。
内容的提问来源于stack exchange,提问作者user2521471
相关产品推荐
相关产品推荐

