IndexError: list index out of range (Python 3.5)
IndexError: list index out of range (Python 3.5)
我正在尝试使用 Python 3.5 打印电子邮件的片段(发件人、主题、正文)。我收到一个奇怪的索引错误:
Traceback (most recent call last):
File "/home/user/PycharmProjects/email/imaplib_fetch_rfc822.py", line 21, in <module>
subject_, from_, to_, body_, = ' ' + email[0], email[1], email[2], 'Body: ' + email[4]
IndexError: list index out of range
我不确定是什么原因造成的,尽管我怀疑我的纠结和分裂是罪魁祸首。我是一个菜鸟编码员,所以我想我所做的远非优雅:
import imaplib
import imaplib_connect
with imaplib_connect.open_connection() as c:
c.select('INBOX')
typ, [msg_ids] = c.search(None, 'TEXT', 'Sunday')
for num in msg_ids.split():
typ, msg_data = c.fetch(num, '(RFC822)')
for raw_email in msg_data:
# raw_email is a tuple of len==2, we need the 2nd item:
b = raw_email[1]
email = str(b).split('\r\n')
subject_, from_, to_, body_, = ' ' + email[0], email[1], email[2], 'Body: ' + email[4]
print(subject_, '\n',
from_, '\n',
body_, '\n')
我不明白这是什么问题。需要注意的一件事是,对于电子邮件部分 email[0]、email[1]、email[2] 和 email[4],我跳过了 email[3],因为它会打印一些随机的电子邮件元数据垃圾。谁能看到我做错了什么?我该怎么做才能纠正错误?
您的 indexing/splitting 有一些问题。我认为您不需要将 raw_email
从元组转换为字符串,只需处理元组即可。
那么,你的split('\r\n')
不正确,应该是split('\r\n')
我认为这会解决它:
for raw_email in msg_data:
# raw_email is a tuple of len==2, we need the 2nd item:
if len(raw_email) >= 2:
b = raw_email[1]
email = b.decode('utf-8').split('\r\n')
subject_, from_, to_, body_, = ' '+email[0], email[1], email[2], 'Body: ' + email[4]
print(subject_, '\n',
from_, '\n',
body_, '\n')
else:
print("This raw_email was not processed: "+ raw_email)
# Use this for debugging if the raw_email is diff't length
这已在 python 2.7 中测试,但似乎有效:
注意:在 python 3.x 中,您需要使用 b.decode('utf-8')
,这在 python 中不是必需的 2.
假设您的电子邮件始终生成 email
长度 == 5 的对象,这应该可以工作。
我正在尝试使用 Python 3.5 打印电子邮件的片段(发件人、主题、正文)。我收到一个奇怪的索引错误:
Traceback (most recent call last):
File "/home/user/PycharmProjects/email/imaplib_fetch_rfc822.py", line 21, in <module>
subject_, from_, to_, body_, = ' ' + email[0], email[1], email[2], 'Body: ' + email[4]
IndexError: list index out of range
我不确定是什么原因造成的,尽管我怀疑我的纠结和分裂是罪魁祸首。我是一个菜鸟编码员,所以我想我所做的远非优雅:
import imaplib
import imaplib_connect
with imaplib_connect.open_connection() as c:
c.select('INBOX')
typ, [msg_ids] = c.search(None, 'TEXT', 'Sunday')
for num in msg_ids.split():
typ, msg_data = c.fetch(num, '(RFC822)')
for raw_email in msg_data:
# raw_email is a tuple of len==2, we need the 2nd item:
b = raw_email[1]
email = str(b).split('\r\n')
subject_, from_, to_, body_, = ' ' + email[0], email[1], email[2], 'Body: ' + email[4]
print(subject_, '\n',
from_, '\n',
body_, '\n')
我不明白这是什么问题。需要注意的一件事是,对于电子邮件部分 email[0]、email[1]、email[2] 和 email[4],我跳过了 email[3],因为它会打印一些随机的电子邮件元数据垃圾。谁能看到我做错了什么?我该怎么做才能纠正错误?
您的 indexing/splitting 有一些问题。我认为您不需要将 raw_email
从元组转换为字符串,只需处理元组即可。
那么,你的split('\r\n')
不正确,应该是split('\r\n')
我认为这会解决它:
for raw_email in msg_data:
# raw_email is a tuple of len==2, we need the 2nd item:
if len(raw_email) >= 2:
b = raw_email[1]
email = b.decode('utf-8').split('\r\n')
subject_, from_, to_, body_, = ' '+email[0], email[1], email[2], 'Body: ' + email[4]
print(subject_, '\n',
from_, '\n',
body_, '\n')
else:
print("This raw_email was not processed: "+ raw_email)
# Use this for debugging if the raw_email is diff't length
这已在 python 2.7 中测试,但似乎有效:
注意:在 python 3.x 中,您需要使用 b.decode('utf-8')
,这在 python 中不是必需的 2.
假设您的电子邮件始终生成 email
长度 == 5 的对象,这应该可以工作。