You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord词典机器人长释义存储失败问题及代码修复请求

修复Discord词典机器人的多空格释义存储问题

问题根源

  1. 参数截断:discord.py 默认按空格拆分命令参数,原代码里的arg2只能获取第一个空格前的内容,导致包含空格的长释义被截断。
  2. 存储格式冲突:原代码用空格分隔作者、单词、释义,读取时split()会将释义内的空格也当作分隔符,导致输出时仅能拿到释义的第一个词。

修复方案

1. 修改命令参数接收方式

将input命令的参数定义改为*, arg2格式,这样arg2会捕获arg1之后的所有内容(包括空格),完整保留长释义:

@bot.command()
async def input(ctx, arg1, *, arg2):

2. 更换存储分隔符

用非空格字符(比如|)作为字段分隔符,避免与释义内的空格冲突,确保存储结构清晰:
存储时的写入格式改为:

entry = f"{ctx.author.name}|{arg1}|{arg2}\n"

3. 调整读取解析逻辑

读取文件时,使用split("|", 2)限制分割次数为2,确保释义部分完整保留,不会被拆分:

info = datafile[i].strip().split("|", 2)

完整修复代码

import discord
from discord.ext import commands

bot = commands.Bot(command_prefix='!', intents=discord.Intents.all())

check_number = 0


@bot.event
async def on_ready():
    print('Logging in..: ')
    print(bot.user.name)
    print('connection was succesful')
    await bot.change_presence(status=discord.Status.online, activity=discord.Game("Testing"))


@bot.command()
async def input(ctx, arg1, *, arg2):
    global check_number
    check_number = 0
    # 使用with语句自动管理文件关闭,避免资源泄漏
    with open("user.txt", "r", encoding="utf-8") as temp_f:
        datafile = temp_f.readlines()
    
    if datafile:
        for i in range(len(datafile)):
            # 精准匹配目标单词,避免误触发
            line_content = datafile[i].strip().split("|", 2)
            if len(line_content) >=2 and line_content[1] == arg1:
                datafile[i] = f"{ctx.author.name}|{arg1}|{arg2}\n"
                with open("user.txt", "w", encoding="utf-8") as temp_f:
                    temp_f.writelines(datafile)
                await ctx.send(f"已存在单词 {arg1} 的记录,已更新为新释义!")
                check_number = 1
                break
    
    if check_number == 0:
        # 追加写入新条目,修复原代码覆盖文件丢失数据的问题
        with open("user.txt", "a", encoding="utf-8") as temp_f:
            temp_f.write(f"{ctx.author.name}|{arg1}|{arg2}\n")
        await ctx.send("记录已添加!")


@bot.command()
async def output(ctx, arg1):
    global check_number
    check_number = 0
    with open("user.txt", "r", encoding="utf-8") as temp_f:
        datafile = temp_f.readlines()
    
    if not datafile:
        await ctx.send("暂无任何记录!:)")
        return
    
    for line in datafile:
        line = line.strip()
        if not line:
            continue
        info = line.split("|", 2)
        if len(info) < 3:
            continue
        author, word, definition = info
        if word == arg1:
            msg = await ctx.send(definition)
            await msg.reply(f"{author} 提交的释义!")
            check_number = 1
            break
    
    if check_number == 0:
        await ctx.send(f"未找到单词 {arg1} 的记录!:)")


bot.run('你的BotToken')

额外优化说明

  • 用with语句管理文件操作,自动关闭文件,避免手动关闭遗漏导致的资源问题。
  • 修复原代码中覆盖文件丢失已有数据的bug,改为追加新条目。
  • 优化单词匹配逻辑,避免因释义包含目标单词导致的误匹配。

内容的提问来源于stack exchange,提问作者coolandniceandcoldguy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:25:37