Python 2800 次迭代后的 IndexError
Python IndexError after 2800 iterations
import config
def parse():
chat_log = open('chat.log', "r", encoding="utf-8")
chat = chat_log.read().split("\n\n\n")
chat_parsed = open("chat.txt", "w", encoding="utf-8")
lines = []
try:
for i in chat:
if len(i) > 0:
x = i.split(" ")
if config.nickname != i.split(" ")[2] and config.nickname != i.split(" ")[4] \
and f"{config.nickname} = #{config.channel}" not in i.split("—")[1].split(":")[2]:
if "PING" not in i:
if len(i) > 0:
user = i.split("—")[1].split(":")[1].split("!")[0]
msg = i.split("—")[1].split(":")[2]
line = [user, msg]
lines.append(line)
for i in lines:
chat_parsed.write(str(i))
chat_parsed.write('\n')
chat_log.close()
chat_parsed.close()
except IndexError:
chat_parsed.write('"[ERROR], [ERROR]"\n')
chat_log.close()
chat_parsed.close()
出于某种我不明白的原因,在第 2800 次调用此函数后 (aprox),它进入了 except 部分。我正在使用它来解析聊天记录,以便稍后在 Twitch 聊天机器人上进行更轻松的处理,因此我必须多次调用解析器才能更新它。谁能帮忙?提前致谢!
此外,错误似乎来自 if config.nickname != i.split(" ")[2] and config.nickname != i.split(" ")[4] and f"{config.nickname} = #{config.channel}" not in i.split("—")[1].split(":")[2]
部分。
在我看来,这像是恶意输入问题,不一定是代码问题。 chat
中的一行可能不是您期望的格式。由于 split
returns 是一个长度可变的列表,您可能不会总是每行获得 5 个成员,并且由于您访问了列表的索引 2 和 4,因此您会在 IndexError
那种情况。
出于调试目的,我建议将 if
语句放在 try/except 子句中并打印给您带来问题的行。那么这就是在 运行 此脚本之前清理数据或以您认为合适的方式处理类似行的问题。
我终于成功了,这里的问题是来自服务器的 PING,它的格式与其他线路不同。
通过切换 if 指令并首先检查 PING 是否是字符串的一部分来解决这个问题。不过,我遇到了一个新问题,机器人在几分钟后断开连接,几乎与最后一个问题被注意到的时间相同。我只是没有响应 ping。非常感谢最后的回答,帮了大忙!
import config
def parse():
chat_log = open('chat.log', "r", encoding="utf-8")
chat = chat_log.read().split("\n\n\n")
chat_parsed = open("chat.txt", "w", encoding="utf-8")
lines = []
try:
for i in chat:
if len(i) > 0:
x = i.split(" ")
if config.nickname != i.split(" ")[2] and config.nickname != i.split(" ")[4] \
and f"{config.nickname} = #{config.channel}" not in i.split("—")[1].split(":")[2]:
if "PING" not in i:
if len(i) > 0:
user = i.split("—")[1].split(":")[1].split("!")[0]
msg = i.split("—")[1].split(":")[2]
line = [user, msg]
lines.append(line)
for i in lines:
chat_parsed.write(str(i))
chat_parsed.write('\n')
chat_log.close()
chat_parsed.close()
except IndexError:
chat_parsed.write('"[ERROR], [ERROR]"\n')
chat_log.close()
chat_parsed.close()
出于某种我不明白的原因,在第 2800 次调用此函数后 (aprox),它进入了 except 部分。我正在使用它来解析聊天记录,以便稍后在 Twitch 聊天机器人上进行更轻松的处理,因此我必须多次调用解析器才能更新它。谁能帮忙?提前致谢!
此外,错误似乎来自 if config.nickname != i.split(" ")[2] and config.nickname != i.split(" ")[4] and f"{config.nickname} = #{config.channel}" not in i.split("—")[1].split(":")[2]
部分。
在我看来,这像是恶意输入问题,不一定是代码问题。 chat
中的一行可能不是您期望的格式。由于 split
returns 是一个长度可变的列表,您可能不会总是每行获得 5 个成员,并且由于您访问了列表的索引 2 和 4,因此您会在 IndexError
那种情况。
出于调试目的,我建议将 if
语句放在 try/except 子句中并打印给您带来问题的行。那么这就是在 运行 此脚本之前清理数据或以您认为合适的方式处理类似行的问题。
我终于成功了,这里的问题是来自服务器的 PING,它的格式与其他线路不同。
通过切换 if 指令并首先检查 PING 是否是字符串的一部分来解决这个问题。不过,我遇到了一个新问题,机器人在几分钟后断开连接,几乎与最后一个问题被注意到的时间相同。我只是没有响应 ping。非常感谢最后的回答,帮了大忙!