Python While循环未按预期执行

2024-09-28 15:37:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一种用Python归档收件箱的方法。我希望代码能够遍历Outlook收件箱中特定文件夹中的所有电子邮件,并检查它们是否已经完成。检查它们是否“完成”将基于与特定电子邮件关联的“TaskCompletedDate”。如果特定电子邮件的“TaskCompletedDate”是一个特定的值,表示该电子邮件尚未完成,它将保持该电子邮件的原样,并继续发送下一封电子邮件。如果它遇到一封电子邮件,其中“TaskCompletedDate”是一个表示已完成的特定值,它会将该电子邮件移动到存档文件夹

以下是我在移动任何实际电子邮件之前测试它的内容,以确保它能正常工作。在下面的代码中,我创建了每封电子邮件主题行的列表(在本例中称为“a”),然后尝试使用While循环遍历每封电子邮件,并检查与之关联的“TaskCompletedDate”是什么。如果它在While循环中通过If条件(在本例中表示尚未完成的电子邮件,应保持原样),它将移动到下一个索引号并继续。如果它到达某个特定电子邮件关联的“TaskCompletedDate”不满足If条件的索引,它将从列表中删除与该索引关联的条目(“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条件的电子邮件的所有主题行(表示已存档并从收件箱中删除的电子邮件)

我遇到的问题是,最终状态似乎出现了一个空列表,我不完全确定原因。文件夹中肯定有满足If条件的电子邮件,因此如果我理解正确,不应从列表中删除这些电子邮件

任何帮助或想法都将不胜感激

提前谢谢你


Tags: 代码文件夹主题列表if电子邮件条目msg
1条回答
网友
1楼 · 发布于 2024-09-28 15:37:56

当您减少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循环和where for循环的用法,因为您的一些语法可以简化和清理一点。 以下是一些指向Python文档部分的好链接: https://docs.python.org/3/reference/compound_stmts.htmlhttps://docs.python.org/3/tutorial/controlflow.html#for-statements

希望这有帮助:)

相关问题 更多 >