Heim  >  Artikel  >  Backend-Entwicklung  >  Problem bei der Verwendung von icalendar zum Parsen von vDDDTypes-Daten in Python

Problem bei der Verwendung von icalendar zum Parsen von vDDDTypes-Daten in Python

PHPz
PHPznach vorne
2024-02-13 10:00:05895Durchsuche

Problem bei der Verwendung von icalendar zum Parsen von vDDDTypes-Daten in Python

Frageninhalt

Wie Sie dem Folgenden wahrscheinlich entnehmen können, bin ich kein sehr erfahrener Programmierer. Nichtsdestotrotz versuche ich, ein Python-Programm zu schreiben, um Daten aus einer Datei im Icalendar-Format zu importieren und in einer Datenbank zu speichern. Die Datei wird wie unten gezeigt mehrmals angezeigt (irrelevante Informationen werden übersprungen):

begin:vevent
uid:tu1586072026
dtstamp:20240125t161430z
summary:my meeting
description:none
...
created:20231004t161313z
last-modified:20231023t162939z
end:vevent

Mein Problem liegt in der Dekodierung des zuletzt geänderten Werts.

Wenn ich renne:

print("dtstamp: " + str(component.get('dtstamp').dt))
    print("created: " + str(component.get('created').dt))
    print("modified: " + str(component.get('last-modified').dt))

Ich habe den Fehler erhalten, nachdem ich die ersten beiden richtig gedruckt habe:

dtstamp: 2024-01-25 16:14:30+00:00
created: 2023-10-04 16:13:13+00:00

traceback (most recent call last):
  file "/usr/lib/python3.11/tkinter/__init__.py", line 1948, in __call__
    return self.func(*args)
           ^^^^^^^^^^^^^^^^
  file "/home/sailslack/coding/python/pim/cal_import.py", line 97, in ical_import
    print("modified: " + str(component.get('last-modified').dt))
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
attributeerror: 'nonetype' object has no attribute 'dt'

Wenn ich das .dt-Attribut in der letzten Zeile nicht verwende:

print("dtstamp: " + str(component.get('dtstamp').dt))
    print("created: " + str(component.get('created').dt))
    print("modified: " + str(component.get('last-modified')))

Ich bekomme keine Fehler, aber:

dtstamp: 2024-01-25 16:14:30+00:00
    created: 2023-10-04 16:13:13+00:00
    modified: vDDDTypes(2023-10-23 16:29:39+00:00, Parameters({}))

Sieht so aus, als ob ich das .dt-Attribut wie andere Attribute verwenden sollte.

Was habe ich falsch gemacht?


Richtige Antwort


UPDATE: Dieses Beispiel funktioniert in meiner Python-Umgebung und verwendet jetzt einen Try-Block, um fehlende Komponenten zu verarbeiten:

from icalendar import calendar
from datetime import datetime

with open('icalendar.ics', 'rb') as e:
    ecal = calendar.from_ical(e.read())
    for component in ecal.walk():
        if component.name == 'vevent':
            print(component.name)
            com_attr = ['created','dtstamp','last-modified']
            for timing in com_attr:
                try:
                    print(f"{timing}: {component.get(timing).dt}")
                except attributeerror:
                    print(f"{timing} -> does not exist!")
            com_text = ['uid','summary','description']
            for tex in com_text:
                try:
                    print(f"{tex}: {component.get(tex)}")                    
                except attributeerror:
                    print(f"{tex} -> does not exist!")

Ausgabe, z. B. die letzte Änderungszeit fehlt:

VEVENT
CREATED: 2023-10-04 16:13:13+00:00
DTSTAMP: 2024-01-25 16:14:30+00:00
LAST-MODIFIED -> does not exist!
UID: TU1586072026
SUMMARY: My meeting
DESCRIPTION: None

Das obige ist der detaillierte Inhalt vonProblem bei der Verwendung von icalendar zum Parsen von vDDDTypes-Daten in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen