Python 关于条件流语句的简单问题

Python 关于条件流语句的简单问题,python,conditional,Python,Conditional,我有一段代码,可以读取Outlook电子邮件并根据特定标准搜索电子邮件,但是,问题是一旦发现所有电子邮件都满足标准,代码就不会停止。它只是继续运行,即使它不再返回任何东西 这就是我到目前为止所做的: 我尝试过使用break语句和多个if语句以及elif。但我似乎无法让它发挥作用 import win32com.client from datetime import date, timedelta outlook = win32com.client.Dispatch("Outlook.Appl

我有一段代码,可以读取Outlook电子邮件并根据特定标准搜索电子邮件,但是,问题是一旦发现所有电子邮件都满足标准,代码就不会停止。它只是继续运行,即使它不再返回任何东西

这就是我到目前为止所做的:

我尝试过使用break语句和多个if语句以及elif。但我似乎无法让它发挥作用

import win32com.client
from datetime import date, timedelta


outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")

inbox = outlook.GetDefaultFolder(18).Folders.Item("Riscunit")
messages = inbox.Items

date = date.today() - timedelta(days=1)
subject = "Catalyst"

for message in messages:
    if subject in message.subject and date == message.senton.date():
      print(message.sender)
      print(message.senton.date())
      print(message.senton.time())
      print(message.body)
    elif subject != message.subject and date != message.senton.date:
     break

我希望代码检索相关电子邮件,然后停止运行。我是Python新手,因此非常感谢您的帮助。

这可能是因为使用
elif
而不是
else
的逻辑

试试这个:

import win32com.client
from datetime import date, timedelta


outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")

inbox = outlook.GetDefaultFolder(18).Folders.Item("Riscunit")
messages = inbox.Items

date = date.today() - timedelta(days=1)
subject = "Catalyst"

for message in messages:
    if subject in message.subject and date == message.senton.date():
      print(message.sender)
      print(message.senton.date())
      print(message.senton.time())
      print(message.body)
    else: 
      subject != message.subject and date != message.senton.date
      break
  • elif
    是不必要的,因为它与
    if
  • 如果当
    为false时确实需要执行某项操作,那么
    else
    将更合适,尽管这里可能不需要
    else
bag=['pizza','ziplocks','panana','milk glass','post its','spray']
食品={1:'比萨饼',2:'香蕉',3:'牛奶'}
#检查购物袋是否有食物
对于袋子中的物品:
对于关键食品:
如果项目中的食品[键]:
打印('eat'+foods[key]);
打破
其他:
打印('放'+项+'收');
打印(“完成”);
下面是另一个例子,当你的if条件不满足时,它会做一些事情:

messages=[{'subject':'shopping list','date':'05/10/2019','body':'milk'},
{'subject':'shopping list','date':'05/10/2019','body':'pizza'},
{'subject':'holiday','date':'12/10/2015','body':'马上需要休假'},
{'subject':'shopping list','date':'12/10/2015','body':'我们需要土豆'}]
日期='2019年10月5日'
主题=“购物清单”
对于邮件中的项目:
对于输入项:
如果项目['subject']中的主题和项目['date']==日期:
打印(“购买”+项目[“正文]);
打破
其他:
打印('archive\''项目['body']+'\'电子邮件');
打破
打印(“完成”);

您可能必须限制测试的消息数量,以查看它们是否符合您的要求:

max = 42
for count, message in enumerate(messages):
    if count > max:
       break
    if subject in message.subject and date == message.senton.date():
       collect(message)   # Do something with this message (print or append to list)


试着用else代替elifh你怎么知道代码一直在运行?
messages
变量是否是某种生成器,它在等待更多电子邮件时会阻塞?请尝试在带有调试环境的IDE中运行它,您可以在其中中断。如果您认为它在没有新消息的情况下仍在运行,请中断以了解在何处以及在何种条件下您的意思是
else:break
?因此,在第一条消息中,如果不是正确的主题或不是正确的日期,循环将退出?@quamrana是的,这正是我想要的。我也试过艾利夫。两者似乎都不正常。我尝试了
else:break
,当我运行代码时,它直接跳转到break语句,不返回任何内容。我使用的是IDE,没有缩进错误。你的
的内容:
没有意义。这些是OP的,不是我的。从我对这个问题的理解来看,如果主题和日期与他所要求的不符,那就打破这个循环。是的,但是你改变了一些东西并发布了它。我肯定会出现语法错误,因为这行末尾有冒号。python中的
else
语句末尾需要一个冒号,所以我不确定您的意思。下一行末尾有一个冒号。嘿,感谢您的回复。在打印行之后直接使用break语句的唯一问题是,它只为请求的一天打印一封电子邮件,然后代码停止。它不会返回请求日期的所有电子邮件。类似地,如果我在else语句后加上break,它似乎会直接跳到break语句,并且什么也不返回。我看到你已经解决了这个问题,这很好。在我的例子中,需要中断以避免循环太多次。在您的情况下,您可能需要取消中断。非常感谢!我试试这个。如果使用指定的日期范围,您认为同样的概念是否可行?因为我正在搜索的邮箱有数千封电子邮件,所以您可以使用以下条件:
。。。和dateHigh>message.senton.date()和DateLow抱歉重新打开此文件,我只是想知道为什么在尝试指定发件人而不是主题时,会出现类型错误
TypeError:此对象不支持枚举
这听起来像是一个单独的问题。编写一些因此错误而失败的简单测试代码,并将代码和完整的回溯作为新问题发布。