为什么我收到错误“列表索引超出范围”以及如何解决?

时间:2019-03-31 20:24:01

标签: python python-3.x email for-loop gmail

我需要我的机器人从Tradingview检查新的gmail消息,并根据主题在if中执行操作

import email, imaplib
import datetime, time
import logging

volume = "0.1"
user = 'xxxxx@gmail.com'
password = 'xxxxxxx'
imap_url = 'imap.gmail.com'

def auth(user,password,imap_url):
    m = imaplib.IMAP4_SSL(imap_url)
    m.login(user,password)
    return m

def readmail(volume):
    time.sleep(1.5)
    m = imaplib.IMAP4_SSL("imap.gmail.com")
    m = auth(user,password,imap_url)
    m.select('INBOX')
    resp, items = m.search(None,
                           "NOT SEEN FROM tradingview")
    items = items[0].split()
    for emailid in items:
        resp, data = m.fetch(emailid,
                             "(RFC822)")
        email_body = data[0][1]
        mail = email.message_from_bytes(email_body)
        ts = time.time()
        st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
        try:
            pair = mail['Subject'].split()[2]
            if mail['Subject'].split()[3] == "Buy":
                m.store(emailid, '+FLAGS', '\Seen')
                print(st + ' \x1b[6;30;42m' + 'Buy')
                logging.info(st + ' Buy')
            if mail['Subject'].split()[3] == "Sell":
                m.store(emailid, '+FLAGS', '\Seen')
                print(st + ' \x1b[6;30;41m' + 'Sell')
                logging.info(st + ' Sell')
        except Exception as e:
            print(e)
            logging.info(e)

while True:
    try:
        readmail(volume)
    except Exception as e:
        print(e)
        logging.info(e)

预期:

print(st +'\ x1b [6; 30; 42m'+'购买')或print(st +'\ x1b [6; 30; 42m'+'卖出))

实际:

列表索引超出范围

但是由于某种原因,我的机器人读取了新消息 m.store(emailid,'+ FLAGS','\ Seen') 并做出“已读”标记

1 个答案:

答案 0 :(得分:0)

好问题!我已经遇到过很多次了,所以我可以得出一些有益的结论。每当您的错误是“列表索引超出范围”时,95%的时间就是列表不包含您认为的那么多值。我确实看到您是新的StackOverflow成员。欢迎来到社区!如果您不熟悉稍微更高级的Python列表概念,请允许我解释一下。

列表中的所有内容都有索引值。无论列表内部的数据类型如何,它都从零开始,然后每个列表项增加一个。

示例:

lista= ['This', 'Is', 'A', 'List!']

上面的索引较低,为0,最后一个索引为3。 细分:

lista= ['This', 'Is', 'A', 'List!']
       index 0   1     2    index 3

最有可能发生的是,您的列表的索引较小,稍后在您的代码中列出。因此,也许您正在上面的列表中调用索引[4]。这将返回错误,因为没有第四个索引。这是....超出范围!那就是你的错误代码的意思!

您可以使用len()转换方法轻松检查列表的长度。这将告诉您列表中有多少个索引。如果要运行下面的代码段:

len(lista)

我会得到:

4

这显示了四个索引。如果您想知道最大的索引,或者想知道最高的索引,请将上面代码段的结果减去1:

print(len(lista)-1)

哪个返回:

3

哪个是您的最高索引。因此,请检查列表的大小,如果您调用正确的索引,我相信您的问题将得到解决。另外,请确保将数据正确添加到列表中,否则肯定不存在!祝您将来所有编码工作顺利,欢迎加入Stack Exchange社区!

Ethan J.