【问题标题】:Python IndexError after 2800 iterations2800 次迭代后的 Python IndexError
【发布时间】:2021-09-15 12:48:44
【问题描述】:
    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 次调用它之后(大约),它进入了 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] 部分。

【问题讨论】:

  • 通过调用这些拆分函数并立即按索引访问,您对字符串形式有很多假设。例如i.split(" ")[4] 假定字符串i (顺便说一句,这有点误导)至少有4 个空格。很可能它的空格少于 4 个,因此调用第五个索引i.split(" ")[4] 会导致索引错误。要进一步调试,您需要了解有关输入数据的更多信息。我建议您打印出代码失败的字符串。将if config.nickname [...] 部分包含在另一个try-except-block 中,并将print(i) 包含在异常中。
  • 你能打印出究竟是什么错误吗?此外,如果您在代码中将 for 循环外的 i 初始化为 i = '',则在收到错误时也可以打印输入。看到这个:stackoverflow.com/questions/9555133/…

标签: python index-error


【解决方案1】:

我终于搞定了,这里的问题是来自服务器的 PING,它的格式与其他行不同。

通过切换 if 指令并首先检查 PING 是否是字符串的一部分来解决此问题。不过,我遇到了一个新问题,机器人在几分钟后断开了连接,这与上一个问题引起注意的时间差不多。我只是没有响应 ping。非常感谢最后的回答,帮助很大!

【讨论】:

    【解决方案2】:

    这在我看来像是恶意输入问题,不一定是代码问题。 chat 中的一行可能不是您期望的格式。由于split 返回一个不同长度的列表,因此您可能不会总是为每行获得 5 个成员,并且由于您访问列表的索引 2 和 4,因此在这种情况下您会得到一个 IndexError

    出于调试目的,我建议将 if 语句放在 try/except 子句中并打印出问题所在的行。那么问题是在运行此脚本之前清理数据或以您认为合适的方式处理类似的行。

    【讨论】:

      猜你喜欢
      • 2016-04-13
      • 2021-10-05
      • 1970-01-01
      • 2011-07-11
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多