मैं एक जार्विस स्टाइल स्क्रीन बना रहा हूं और आने वाली मीटिंग्स के लिए आउटलुक से डेटा खींच लिया है जिसे मैं स्क्रीन पर प्रस्तुत करना चाहता हूं।

फ़ंक्शन आउटलुक से डेटा खींचता है और इसे एक सूची में प्रस्तुत करता है: -

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()"""

सबको शुक्रीया,

ग्रीम

1
Graeme Lawrie 29 नवम्बर 2020, 23:15

2 जवाब

सबसे बढ़िया उत्तर

यह शायद थोड़ा हैकी है लेकिन आपके स्ट्रिंग में event के लिए सिंटैक्स वैसा ही है जैसा कोई डिक्शनरी को परिभाषित करता है। इसलिए हम 'ईवेंट' को 'तानाशाह' से बदल सकते हैं और eval पर कॉल कर सकते हैं जो मूल रूप से एक स्ट्रिंग का मूल्यांकन करता है जैसे कि यह पायथन कोड था। तो उदाहरण के लिए यदि आप इसे चलाते हैं

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))

और फिर events[i]['Start'] आदि के माध्यम से फ़ील्ड प्राप्त करने के लिए dict कार्यक्षमता का उपयोग करें

1
piterbarg 29 नवम्बर 2020, 23:51

तो आपके सुझाव के बाद मैं यही लेकर आया - एक इलाज की तरह काम किया - बहुत-बहुत धन्यवाद :) आप एक सुपर स्टार हैं!

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'])
0
Graeme Lawrie 30 नवम्बर 2020, 00:16