如何解决Python While循环未按预期执行
我正在尝试创建一种在Python中归档我的收件箱的方法。我想让代码遍历Outlook收件箱中特定文件夹中的所有电子邮件,并检查它们是否已经完成。检查它们是否“完成”将基于与特定电子邮件相关联的“ TaskCompletedDate”。如果特定电子邮件的'TaskCompletedDate'是某个值,表明它尚未完成,它将使该电子邮件保持原样并继续处理下一封电子邮件。如果遇到“ TaskCompletedDate”是某个值(表示已完成)的电子邮件,则会将电子邮件移至存档文件夹。
以下是我为移动任何实际电子邮件以确保其正常工作之前编写的测试内容。在下面的代码中,我正在创建每封电子邮件的主题行的列表(在这种情况下,称为“ a”),然后尝试使用While循环遍历每封电子邮件,并检查与之关联的“ TaskCompletedDate”是什么。如果它在While循环中通过了If条件(在这种情况下表示尚未完成的电子邮件,应保留原样),它将移至下一个索引号并继续。如果到达特定电子邮件的关联“ TaskCompletedDate”不满足“如果”条件的索引,它将从列表中删除与该索引关联的条目(“ a”)。在实际情况下,电子邮件将在存档时从文件夹中删除,这大概意味着每封电子邮件的索引都会随之变化。因此,我还添加了一个子句,用于在每次从列表中删除条目(或在实际情况下将其归档)时,将范围长度(代表文件夹中电子邮件的总数)减少1。
import win32com.client
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
folder = outlook.Folders.Item("Example@Example.com")
inbox = folder.Folders.Item("Inbox")
msg = inbox.Items
a=[]
for i in range(len(msg)):
a.append(msg[i].Subject)
aLen = len(a)
i = 0
while i < aLen:
if str(msg[i].TaskCompletedDate)[0:4] != '2020':
i += 1
else:
del a[i]
aLen = aLen - 1
列表的期望最终状态是,它将仅包含在While循环内满足If条件的电子邮件的主题行(代表未归档的电子邮件),以及所有不满足条件的电子邮件的主题行如果为条件,将从列表中删除(代表已存档并从收件箱中删除的电子邮件)。
我遇到的问题是,最终状态似乎列出了一个空列表,我不确定为什么。文件夹中肯定有满足If条件的电子邮件,因此,如果我理解正确,则不应将其从列表中删除。
任何帮助或想法都将不胜感激。
提前谢谢!
解决方法
当减小aLen
以避免索引超出范围错误时,有可能(即使一个值都不满足您的条件)您也不会完全遍历msg
。根据项目的订购方式,这可能会引起您的问题。为了理智,我还将检查msg
是否为空。
如果您需要或倾向于保持循环,我建议仅附加符合条件的项目。从存储优化和最佳实践的角度来看,这比用所有可能的项目填充a
并删除不符合条件的项目更为干净和有效。因此,我将您的for和while循环替换为:
a=[]
for x in msg:
if str(x.TaskCompletedDate)[0:4] != '2020':
a.append(x.Subject)
否则,填充a
的一种更有效的方法是:
a = [x.Subject for x in msg if str(x.TaskCompletedDate)[0:4] != '2020']
最后一点,我建议您阅读for循环以及在while循环中使用的位置以及在何处使用for循环,因为可以简化和清除一些语法。 以下是一些Python文档的良好链接: https://docs.python.org/3/reference/compound_stmts.html https://docs.python.org/3/tutorial/controlflow.html#for-statements
希望这会有所帮助:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。