datetime.date und str

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
source_py
User
Beiträge: 3
Registriert: Montag 30. Dezember 2013, 15:53

Hi,

ich möchte eine .org Datei parsen, dazu verwende ich Orgnode. (http://members.optusnet.com.au/~charles ... Orgnode.py) Die (plaintext) Datei könnte so aussehen:

Code: Alles auswählen

* TODO [#A] Ich bin ein älteres TODO (29.12.2013)
DEADLINE: <2013-12-29 Sun>
* TODO [#A] Ich bin ein heutiges TODO (30.12.2013)
DEADLINE: <2013-12-30 Mon>
In Anlehnung an ein Minimal-Beispiel (http://members.optusnet.com.au/~charles ... gnode.html) des Autors:

Code: Alles auswählen

import datetime

today = datetime.date.today()

filename = "/Users/NAME/org/privat.org"
nodelist = makelist(filename)

for n in nodelist:
    if today == n.Deadline():
     print "%s" % (n.Heading())
Das funktioniert und die Ausgabe lautet: Ich bin ein heutiges TODO (30.12.2013)
Nun möchte ich wissen, ob überfällige Einträge existieren:

Code: Alles auswählen

for n in nodelist:
    if today > n.Deadline():
     print "%s" % (n.Heading())
Und das resultiert in einem: TypeError: can't compare datetime.date to str
Laut Dokumentation liefert Deadline() ein date object zurück:

Code: Alles auswählen

# aus http://members.optusnet.com.au/~charles57/GTD/Orgnode.py
…
           dd_re = re.search('DEADLINE:\s*<(\d+)\-(\d+)\-(\d+)', line)
           if dd_re:
              deadline_date = datetime.date(int(dd_re.group(1)),
                                            int(dd_re.group(2)),
                                            int(dd_re.group(3)) )
…
   if deadline_date:
      thisNode.setDeadline(deadline_date)
Zu Versuchszwecken:

Code: Alles auswählen

for n in nodelist:
    deadline = datetime.datetime.strptime(n.Deadline(), '%y-%m-%d').date()
Ergibt: TypeError: must be string, not datetime.date

Meiner Meinung nach versuche ich hier zwei datetime.date Objekte zu vergleichen. Sieht jemand den Fehler?

Danke im Voraus!
BlackJack

@source_py: Gibt doch vor dem ``if`` einfach mal das Ergebnis von `type()` von beiden Werten aus, dann siehst Du ja welchen Typ die jeweils tatsächlich an der Stelle haben.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Lass Dir doch mal den Typen von ``n.Deadline()`` ausgeben! Und natürlich den von ``today`` - was das für Objekte sind, können wir aus dem gezeigten Code ja nicht eindeutig schließen... Dazu kannst Du ``type()`` nutzen.

Edit: Mist, heute bin ich mal zu langsam :-D
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
source_py
User
Beiträge: 3
Registriert: Montag 30. Dezember 2013, 15:53

Wow, das geht hier schnell. Danke an euch beide!
Als relativ Unerfahrener in dynamischen Sprachen stellt mich das vor ein Rätsel:

Code: Alles auswählen

for n in nodelist:
    print 'today.......' , type(today)
    print 'n.Deadline()' , type(n.Deadline())

Code: Alles auswählen

today....... <type 'datetime.date'>
n.Deadline() <type 'datetime.date'>
today....... <type 'datetime.date'>
n.Deadline() <type 'str'>
today....... <type 'datetime.date'>
n.Deadline() <type 'str'>
today....... <type 'datetime.date'>
n.Deadline() <type 'str'>
today....... <type 'datetime.date'>
n.Deadline() <type 'str'>
today....... <type 'datetime.date'>
n.Deadline() <type 'datetime.date'>
today....... <type 'datetime.date'>
n.Deadline() <type 'str'>
today....... <type 'datetime.date'>
n.Deadline() <type 'str'>
today....... <type 'datetime.date'>
n.Deadline() <type 'str'>
today....... <type 'datetime.date'>
n.Deadline() <type 'str'>
today....... <type 'datetime.date'>
n.Deadline() <type 'datetime.date'>
today....... <type 'datetime.date'>
n.Deadline() <type 'str'>
today....... <type 'datetime.date'>
n.Deadline() <type 'datetime.date'>
Ich habe nicht die geringste Ahnung wie das sein kann und bin für jede Hilfe dankbar!
BlackJack

@source_py: Die Dokumentation sagt zu `Deadline()`: „Return the deadline date object or null if nonexistent”. Mit „null” meint der Autor hier anscheinend eine leere Zeichenkette. Ich hätte von einem Pythonprogrammierer ja sowohl in der Dokumentation als auch als Rückgabewert `None` in diesem Fall erwartet. Der Quelltext sieht aber sowieso nicht nach einem Pythonprogrammierer aus. Du musst den Wert also testen bevor Du ihn verwendest.

Code: Alles auswählen

import datetime
from Orgnode import makelist


def main():
    today = datetime.date.today()
    nodes = makelist('test.org')
    for node in nodes:
        deadline = node.Deadline()
        if deadline and today > deadline:
            print node.Heading()


if __name__ == '__main__':
    main()
source_py
User
Beiträge: 3
Registriert: Montag 30. Dezember 2013, 15:53

Vielen Dank. Ich muss mich entschuldigen, habe zwar den Debugger schon angeworfen - bevor ich gepostet habe - nur leider mit einem anderen org file.

Führt man die Prüfung nicht durch und hat ein Eintrag kein Datum, dann wird ein Objekt vom Typ str der Liste angehängt. Wunderschön im Debugger zu sehen, wenn man nur das richtige Testfile verwendet.

Danke euch allen! :)
Antworten