Python Sortieren von Abfallteminen.ics nach Datum

  • Ich habe nur wenig Ahnung von Python, aber habe aus einer Abfalltermine.ics Datei

    per Python einen Datei mit Datum, Farben und Bezeichnungen erzeugt.

    12.11.2021 gelbe Wertstofftonne

    23.11.2021 schwarze Restmülltonne

    09.11.2021 grüne Biotonne

    10.11.2021 blaue Papiertonne

    usw.


    Dies Datei müßte nun aufsteigend nach Datum sortiert werden und

    soll über MQTT, ESPHOME auf einem ESP32 Display die nächsten

    3 Abfuhrtermine anzeigen.

    Ich habe nun ein Beispiel gefunden und verstehe das Sortieren in der lezte Zeile) nicht:

    Python
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from datetime import datetime
    infile = open("Tonnen1.txt", "r")
    outfile = open("TonnenSort.txt", "w")
    liste = infile.readlines()
    liste.sort(key=lambda tup: datetime.strptime(tup[3], '%d.%m.%Y'))

    Fehlermeldung:

    Code
    raceback (most recent call last):
      File "readabfuhr5.py", line 12, in <module>
        liste.sort(key=lambda tup: datetime.strptime(tup[3], '%d.%m.%Y'))
      File "readabfuhr5.py", line 12, in <lambda>
        liste.sort(key=lambda tup: datetime.strptime(tup[3], '%d.%m.%Y'))
      File "/usr/lib/python2.7/_strptime.py", line 332, in _strptime
        (data_string, format))
    ValueError: time data '/' does not match format '%d.%m.%Y'

    Ist der Ansatz überhaupt richtig?
    Ich würde mich über eine Unterstützung freuen.

    Grüsse,

    Thomas

  • Python
    from datetime import datetime
    
    liste = [ "12.11.2021 gelbe Wertstofftonne",
              "23.11.2021 schwarze Restmülltonne",
              "09.11.2021 grüne Biotonne",
              "10.11.2021 blaue Papiertonne"]
    
    liste.sort( key = lambda line: datetime.strptime(line[0:10],"%d.%m.%Y") )
    
    print( liste )
  • Ich bin begeistert. Die Selektion des Datums war mein Problem.

    Code
    line[0:10]

    Danke und Grüsse

    Thomas

  • Hier mal ohne lambda. Anfänger haben Problem mit lambda.

    Anstelle immer 10 Zeichen zu erwarten, kann man den String auch splitten und maxsplit auf 1 begrenzen.

    Dann hat man einmal das Datum und den Rest, den man nicht braucht.


    Wenn man auf der rechten Seite eine Sequenz hat und diese dekonstruieren will, muss man auf der linken Seite genau so viele Namen stehen haben:

    Code
    # links, rechts = ("links", "rechts")
    # links, rechts, irgendwas = ("links", "rechts") # ValueError .. ein Element zu wenig
    links, rechts = "links rechts was anderes".split(maxsplit=1) # passt wieder, da nur 2 Elemente in der Liste sind
    
    print(links)
    print(rechts)
    Quote

    links

    rechts was anderes


    Der Name _ ist eine Konvention in Python. Den nutzt man immer, wenn man etwas zuweisen will, dass später nicht verwendet wird.

    In der REPL wird dem Namen _ immer das letzte Ergebnis zugewiesen, sofern es nicht einem anderen Namen zugewiesen worden ist.


    Code
    [deadeye@nexus ~]$ python3
    Python 3.10.0 (default, Oct  4 2021, 22:01:55) [GCC 11.1.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sys
    >>> sys.version
    '3.10.0 (default, Oct  4 2021, 22:01:55) [GCC 11.1.0]'
    >>> print(_)
    3.10.0 (default, Oct  4 2021, 22:01:55) [GCC 11.1.0]
    >>>