python - 每 20 分钟左右列出一次超出范围的索引错误

标签 python list indexing

在我编写的 IRC 机器人中,我有两个函数可以检索发送消息的用户和已发送的消息。它通过将发送给机器人的读取缓冲区行分成两部分来实现这一点,然后使用第二个列表索引来检索用户/消息。这是代码的第一部分:

def getUser(line):
    if "!" in line:
        separate = line.split(":", 2)
        user = separate[1].split("!", 1)[0]
        return user
    else:
        print "Nothing to receive from the server!"
def getMessage(line):
    if ':' in line:
        separate = line.split(":", 2)
        message = separate[2]
        return message
    else:
        print "Nothing to receive from the server!"

如您所见,我试图形成一种方法来阻止自身在没有从服务器接收到任何内容时从服务器超时;这就是问题的根源。它会检索一行空行,然后尝试拆分空行,然后它尝试访问超出范围的列表索引。我有一个想法,这可以使用 try/catch 语句来完成,但是我是 Python 的新手,对此知之甚少。以下是访问函数的其余代码,如果有帮助的话:

readbuffer = readbuffer + s.recv(1024)
temp = string.split(readbuffer, "\n")
readbuffer = temp.pop()

for line in temp:
    user = getUser(line)
    message = getMessage(line)

我在行 message = getMessage(line)user = getUser(line) 上收到列表索引错误。

最佳答案

我认为您的问题出在这些行中(可能除了不检查是否为空字符串,如gariepy的回答所示):

separate = line.split(":", 2)
user = separate[1].split("!", 1)[0]

separate = line.split(":", 2)
message = separate[2]

在第一种情况下,您假设 separate 至少有 2 个元素(因为您在 separate[1] 上使用了 split) ,在第二种情况下,您假设 separate 至少有 3 个元素(因为您在 separate[2] 上使用 split)。在访问这些索引之前,您应该先检查它们的长度,如下所示:

separate = line.split(":", 2)
if len(separate) >= 2:
    user = separate[1].split("!", 1)[0]

separate = line.split(":", 2)
if len(separate) >= 3:
    message = separate[2]

此外,请记住在对其应用拆分之前检查 line 是否为非空字符串,如其他答案所示。希望对您有所帮助。

关于python - 每 20 分钟左右列出一次超出范围的索引错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35858419/

相关文章:

python - 在数组中查找单词并在 Pandas 的 Dataframe 中获取它们的索引

python - 如何从两个平行字符串创建字典?

c - C 中指向链表的数组加倍

search - 合并索引中的字段

python - 如何创建混淆的本地密码

python - 获取排序的索引列表,用于按给定键排序的字典列表

C 段错误核心转储

mysql - 我怎样才能提高这个 MySQL 查询的性能?

mongodb - 有什么简单的方法可以判断 mongodb 索引是否仍在使用?

python - 重构代码以便使用 3 个值来制作绘图和元组索引必须是整数,而不是 float