拉取要演示的项目 我有一个从 Outlook 中获取的列表,但需要将这些项目分解为单独的字符串



我正在创建一个 Jarvis 风格的屏幕,并从 Outlook 中提取我希望在屏幕上显示的即将举行的会议的数据。

该函数从 Outlook 中提取数据并将其显示在列表中:-

event(Start=datetime.datetime(2020, 11, 30, 12, 30), Subject='meeting 1 description', 
Duration=60)
event(Start=datetime.datetime(2020, 11, 30, 14, 0), Subject='meeting 2 description', Duration=60)
event(Start=datetime.datetime(2020, 12, 1, 8, 30), Subject='meeting 3 description', Duration=60)
event(Start=datetime.datetime(2020, 12, 1, 10, 15), Subject='meeting 4 description', Duration=45)
event(Start=datetime.datetime(2020, 12, 1, 11, 0), Subject='meeting 5 description ', 
Duration=90)"

这很好,但我现在想做的是把这个礼物作为:

Start time = 'start time'

主题 ="会议说明" 持续时间 ="会议持续时间">

有没有办法在列表项中切开字符串,然后将其拉到我想要呈现的代码中?基本上将列表中的项目拆分为组件部分?

以下是拉取列表的代码:-

def get_date(datestr):
try:  # py3
adate = datetime.datetime.fromtimestamp(datestr.Start.timestamp())
except Exception:
adate = datetime.datetime.fromtimestamp(int(datestr.Start))
return adate
def getCalendarEntries(days=3, dateformat="%d/%m/%Y"):
Outlook = win32com.client.Dispatch("Outlook.Application")
ns = Outlook.GetNamespace("MAPI")
appointments = ns.GetDefaultFolder(9).Items
appointments.Sort("[Start]")
appointments.IncludeRecurrences = "True"
today = datetime.datetime.today()
begin = today.date().strftime(dateformat)
tomorrow = datetime.timedelta(days=days) + today
end = tomorrow.date().strftime(dateformat)
appointments = appointments.Restrict(
"[Start] >= '" + begin + "' AND [END] <= '" + end + "'")
events = []
for a in appointments:
adate = get_date(a)
events.append(event(adate, a.Subject, a.Duration))
return events

if __name__ == "__main__":
events = getCalendarEntries()"""

谢谢大家,

格雷姆

这可能有点笨拙,但字符串中event的语法与定义字典的语法相同。因此,我们可以将"event"替换为"dict"并调用eval它基本上可以像Python代码一样计算字符串。所以例如,如果你运行这个

import datetime
event_str = r"event(Start=datetime.datetime(2020, 11, 30, 12, 30), Subject='meeting 1 description', Duration=60)"
dict_str = event_str.replace('event','dict')
my_dict = eval(dict_str)
print(my_dict)

这将打印

{'Start': datetime.datetime(2020, 11, 30, 12, 30), 'Subject': 'meeting 1 description', 'Duration': 60}

因此my_dict将是一个字典,您可以从中提取各种位,例如my_dict['Start']会给你开始(作为日期时间)等

您需要在events列表的每个元素上调用此结构,例如,以下内容应创建一个字典列表,每个事件一个字典

all_dicts = [eval(e.replace('event','dict')) for e in events]

当然,如果您首先创建了字典,则可以省去所有这些麻烦,因此请将循环中的相关行替换为

events.append(dict(Start=adate, Subject=a.Subject, Duration=a.Duration))

然后使用dict功能通过events[i]['Start']等获取字段

所以这就是我在你的建议之后想到的 - 像一种享受一样 - 非常感谢:)你是一个超级明星!

import win32com.client
import datetime
from collections import namedtuple

event = namedtuple("event", "Start Subject Duration")

def get_date(datestr):
try:  # py3
adate = datetime.datetime.fromtimestamp(datestr.Start.timestamp())
except Exception:
adate = datetime.datetime.fromtimestamp(int(datestr.Start))
return adate

def getCalendarEntries(days=3, dateformat="%d/%m/%Y"):
Outlook = win32com.client.Dispatch("Outlook.Application")
ns = Outlook.GetNamespace("MAPI")
appointments = ns.GetDefaultFolder(9).Items
appointments.Sort("[Start]")
appointments.IncludeRecurrences = "True"
today = datetime.datetime.today()
begin = today.date().strftime(dateformat)
tomorrow = datetime.timedelta(days=days) + today
end = tomorrow.date().strftime(dateformat)
appointments = appointments.Restrict(
"[Start] >= '" + begin + "' AND [END] <= '" + end + "'")
events = []
for a in appointments:
adate = get_date(a)
events.append(dict(Start=adate, Subject=a.Subject, Duration=a.Duration))
return events

if __name__ == "__main__":
events = getCalendarEntries()
print ("Time:", events[1]['Start'])
print ("Subject:",events[1]['Subject'])
print ("Duration:",events[1]['Duration'])

最新更新