Discord Bot配置CS 1.6服务器时触发IndexError(list index out of range)问题排查求助
问题分析与解决方案
错误原因
你遇到的IndexError: list index out of range来自database.py的replace_db函数,主要是两个问题导致的:
- 空行触发索引访问失败:当
database.csv是空文件,或是手动编辑后留下了空行时,csv.reader会把空行解析成空列表[]。此时代码直接访问row[0],自然会触发索引越界错误。 - 数据写入逻辑错误:原代码在写回数据库时,只写入了
lines[x][0](仅服务器ID),完全丢失了对应的IP地址信息。这不仅会导致后续读取数据不完整,还可能引发其他连锁错误。
修复方案
我们需要修改database.py中的相关函数,处理空行、文件不存在的情况,同时修复数据写入逻辑:
修改后的database.py代码
import discord, csv, os # 新增os模块用于文件存在性检查 from discord.ext import commands from discord.ext.commands import bot class Database(commands.Cog): def __init__(self, client): self.client = client async def read_db(self): lines = list() # 处理文件不存在的情况 if not os.path.exists('database.csv'): return lines with open('database.csv', 'r') as file: reader = csv.reader(file) for row in reader: # 跳过空行,只保留有效记录 if row: lines.append(row) return lines async def write_db(self, guild_id, address): with open('database.csv', 'a', newline='') as file: writer = csv.writer(file) writer.writerow([guild_id, address]) async def replace_db(self, guild_id): # 如果数据库文件不存在,直接返回,无需执行删除操作 if not os.path.exists('database.csv'): return lines = list() guild_id_str = str(guild_id) with open('database.csv', 'r') as inp: reader = csv.reader(inp) for row in reader: # 跳过空行,仅保留非当前服务器的有效记录 if row and row[0] != guild_id_str: lines.append(row) with open('database.csv', 'w', newline='') as file: writer = csv.writer(file) # 完整写入所有保留的行(包含服务器ID和IP地址) writer.writerows(lines) def setup(client): client.add_cog(Database(client))
关键修复点说明
- 文件存在性检查:在
read_db和replace_db中先判断文件是否存在,避免空文件或无文件时的读取报错。 - 空行过滤:遍历CSV行时先判断
row是否为空,再进行后续操作,彻底避免空列表的索引访问。 - 完整数据写入:使用
writer.writerows(lines)直接写入所有保留的完整记录,不再丢失IP地址信息。
额外建议
- 首次运行Bot时,
database.csv会自动创建,无需手动生成。 - 手动编辑数据库文件时,尽量不要留下空行,防止再次触发类似问题。
内容的提问来源于stack exchange,提问作者Rosco
相关产品推荐
相关产品推荐

