簡體   English   中英

為什么我收到錯誤“列表索引超出范圍”以及如何修復它?

[英]Why i get an error "list index out of range" and how to fix it?

我需要我的機器人檢查來自 tradeview 的新 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' + 'Buy') 或 print(st + ' \\x1b[6;30;42m' + 'Sell')

實際的:

列表索引超出范圍

但出於某種原因,我的機器人讀取新消息 m.store(emailid, '+FLAGS', '\\Seen') 並標記“已讀”

好問題! 我已經遇到過很多次了,所以我可以得出一些有用的結論。 每當您的錯誤是“列表索引超出范圍”時,95% 的時間是列表中沒有您想象的那么多值。 我確實看到您是 StackOverflow 的新成員。 歡迎來到社區! 如果您不熟悉稍微更高級的 Python 列表概念,請允許我解釋一下。

列表中的所有內容都有一個索引值。 它從 0 開始,每個列表項增加 1,與列表中的數據類型無關。

例子:

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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM