python - 为什么我收到错误“列表索引超出范围”以及如何解决?
问题描述
我需要我的机器人检查来自 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') 并做出了“已读”标记
解决方案
好问题!我遇到过很多次,所以我可以得出一些有用的结论。每当您的错误是“列表索引超出范围”时,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.
推荐阅读
- r - 在 R 中使用约束进行优化
- docker - 暴露通过 SSH 转发的 docker 端口
- javascript - 总是访问的数组最好是全局的还是本地的?
- kotlin - 存储库模式中的 Kotlin Flow
- python - Oracle SQL 显示记录 WHERE 每对 (a,b) 有多个记录
- qt - Button 的属性“样式”无效
- python - 如何制作我自己的共享 Google Drive 文件的副本?
- post - 通过 POST 请求进行 Google Calendar api 身份验证
- django-rest-framework - 从子序列化程序 Django Rest Framework 覆盖序列化程序字段
- r - 无法在 ubuntu 上安装 V8 包?