prüfen: aktuellen Tag in String

  • Hallo,

    ich will, dass eine Schleife in Python nur dann abgearbeitet wird, wenn der aktuelle Tag ein definierte Wochentag ist.

    Bei meinem "Rufnummernansagte-Tool" (in mehreren Threads schon erwähnt), soll eine Eingabe der Konfiguration über eine Webseite möglich sein.

    Das funktioniert, die Werte werden in deiner Datenbank gespeichert.

    Nun soll, wenn ein Anruf erfolgt, in dieser Datenbank nachgesehen werden, ob der aktuelle Tag ein Wochentag ist, in dem die Ansage erfolgen soll.

    Ich habe in der Datenbank ein Feld, in dem die Wochentage aufgelistet sind, bei denen die Ansage erfolgen soll.

    Das entsprechende Feld enthält die Nummer des Wochentagen.

    Also "12457", wenn am Montag, Dienstag, Donnerstag, Freitag und Sonntag die Ansage erfolgen soll.

    Wie fragt man dieses am besten ab, wenn man den Wochentag durch dir Python-Abfragte "date.today().weekday() + 1" erhält?

    (Das ist doch der aktuelle Wochentag, oder? Heute ist Montag, und da kommt '0' raus, ich habe den Montag aber als '1' definiert)

    Computer ..... grrrrrr

  • Irgendwie will es nicht.

    (die 'print' sind zum Debugging)

    Code
    ...
    cur1.execute("SELECT inhalt FROM config where name like \"Wochentag\"")
    wochentag = cur1.fetchone()[0]
    print ( wochentag )
    print str(date.today().weekday())
    wtag = str(date.today().weekday() + 1)
    print wtag
    if wtag in [int(c) for c in wochentag]:
    ...

    Hier wird die 'if'-Bedingung nie ausgeführt

    In 'wochentag' steht z.B. '1', oder '12', bei 'wtag' wird heute die'1' ausgegeben, damit müsste doch die Abfrage 'TRUE' sein und ausgeführt werden, wird aber nicht.

    Es gibt einfach keine Fehlermeldung, das Script tut so, als wenn das nie 'TRUE' wid.

    Computer ..... grrrrrr

    2 Mal editiert, zuletzt von Rasp-Berlin (17. Oktober 2017 um 16:59)

  • Zitat

    In Python 2 ist print eine Anweisung und keine Funktion

    Und?

    Ich bekomme eine 'Zahl' aus der SQL-Abfrage, die ich mir einfach anzeigen lasse.

    Dann wird bei dieser 'Zahl' geprüft, ob die Ziffer des aktuellen Tages (+1, da der Montag bei 0 anfängt) in dieser Zahl ist.

    Die 'print' sind, wie gesagt, nur für das Debugging. Im 'if' ist kein 'print' enthalten.

    Wenn ich also aus der Datenbankabfrage '12' angezeigt bekomme, durch da 'print', sollte für den Montag (0), da hier eine '1' addiert wird, die 'if'-Abfrage erfolgreich sein.

    Was sie aber nicht ist.

    Und das wundert mich.

    Computer ..... grrrrrr

  • Gewöhne dir lieber jetzt als später an deine SQL Statements einheitlich zu schreiben... SELECT ... FROM ... where ... like ? :conf: Sieht irgendwie unschön aus...

    Dann ist deine LIKE Abfrage etwas seltsam - hast du vielleicht missverstanden wofür LIKE genutzt wird?

    Wenn ich dich richtig verstehe heißt deine Spalte wirklich Wochentag und somit wäre die LIKE Klausel falsch.

    Allgemein finde ich deine Datenbankstruktur aber etwas seltsam...

    Deine Variable der SQL-Abfrage wochentag zu nennen ist aber auch leicht irreführend, da ja offensichtlich nicht nur ein Tag sondern mehrere enthalten ist ;)

    Und last but not least:

    Ist date.today().weekday() ein datetime Objekt? Dann musst du wochentag auch zu einem datetime Objekt machen, sonst wird das eh nichts :fies:

    Übrigens ist mit date.today().weekday() der Montag 0 und Sonntag 6. Das ist glaub ich das Englische Format ;)

    Man kann aber auch date.today().isoweekday() verwenden, dann wäre Montag 1 und Sonntag 7, und somit brauchst du auch nicht +1 rechnen...


    Ergänzend zu dem was bootsmann schrieb - Erklärung:

    So wie es aussieht verwendest du Python2 ? Denn sonst könnte print wtag nicht funktionieren - python3 wirft da normalerweise eine Fehlermeldung aus...

    Python2 ist in manchen Dingen anders als Python3. Du verwendest für print eine Schreibweise von python3 die aber in python2 eine andere Auswirkung hat. Da dein Script für python2 zu sein scheint, bewirkt print("bla") das es vor der Ausgabe zu einer Tuple wird sobald mehrere "stellen" dazu kommen.

    Führt man in python2 ein print("test") aus erfolgt zwar keine Fehlermeldung, aber das ist kein Funktionsaufruf sondern die Ausgabe der Tuple ("test")

    Du hast 3 Möglichkeiten das zu korregieren:

    1. Du importierst die print Funktion aus __future__ sodass es kein Statement sondern eine Funktion wird und die Klammern eine Daseinsberechtigung haben, wie in python3: from __future__ import print_function

      Am Restlichen Code brauchst du dann nichts mehr ändern.

    2. Du änderst alle print in deinem Code ab und nimmst die Klammern weg, zum Beispiel print("bla") in print "bla"
    3. Du schreibst deinen Code vollständig für python3 und führst ihn dann auch damit aus..

    Das Problem siehst du ganz gut in der interaktiven Python-Konsole:

  • Führt man in python2 ein print("test") aus erfolgt zwar keine Fehlermeldung, aber das ist kein Funktionsaufruf sondern die Ausgabe der Tuple ("test")

    Nope. Mit deinem print Statement vs Function hast du recht, aber ("test") ist kein tuple, die Klammern sind ohne Funktion. Ein Einelementtuple geht nach wie vor so: ("test",). Bei print(1, 2, 3) (funktionell das gleiche wie print (1, 2, 3)) wird in Python 2 tatsächlich ein Tuple ausgegeben.

    Python
    Python 3.5.2 (default, Sep 14 2017, 22:51:06) 
    [GCC 5.4.0 20160609] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> type(("test"))
    <class 'str'>
    >>> type(("test",))
    <class 'tuple'>
    >>>
  • Zitat

    Dann ist deine LIKE Abfrage etwas seltsam - hast du vielleicht missverstanden wofür LIKE genutzt wird?

    Wenn ich dich richtig verstehe heißt deine Spalte wirklich Wochentag und somit wäre die LIKE Klausel falsch.

    Nein, das ist Richtig. Die Spalten heißen 'name' und 'inhalt'.

    Und ich suche den Wert von 'inhalt' von der Zeile, in welcher der Wert von 'name' eben 'Wochentag' ist.

    Zitat

    Die 'print' sind, wie gesagt, nur für das Debugging. Im 'if' ist kein 'print' enthalten.

    ----

    Zitat
    Code
    print wochentag, type(wochentag), [int(c) for c in wochentag], wtag in [int(c) for c in wochentag]

    werde ich morgen ausprobieren.

    Computer ..... grrrrrr

  • Auch wenn die prints nur zum debuggen sind, sind sie falsch - gewöhne es dir lieber gar nicht erst an falsch zu machen ;)

    Nein, das ist Richtig. Die Spalten heißen 'name' und 'inhalt'.

    Und ich suche den Wert von 'inhalt' von der Zeile, in welcher der Wert von 'name' eben 'Wochentag' ist.

    :conf: wat?... Deine Abfrage die du oben gezeigt hast lautet

    "SELECT inhalt FROM config WHERE name LIKE \"Wochentag\""

    Demnach hast du eine Tabelle config mit den Spalten inhalt und name ... Und suchst dann in der Spalte name nach dem Feld Wochentag

    Korrekter wäre, man SELECT'ed das was für die Abfrage erforderlich ist und macht dann nicht LIKE sondern =

    ... Denn LIKE ist ein wildcard, du suchst aber nicht nach *Wochentag* denn das wäre in SQL %Wochentag%

    Also:

    "SELECT inhalt FROM config WHERE name='Wochentag'"

    id name inhalt
    1 Aktiv 1
    2 Wochentag 12457
  • Ich hatte es schon zu oft, dass genau diese Abfrage

    Code
    name='Wochentag'

    nicht das gewünschte Ergebnis brachte, so dass ich lieber 'like' nehme.

    Wenn man als 'Suchbegriff' den vollständigen Wert nicht, ist es egal, dass 'like' die Wildcart-Version von '= %Wert%' ist, denn mehr als den Vollständigen wert kann ja nicht gefunden werden.

    (Ja, 'WHERE' und 'LIKE' ebenfalls groß zu schreiben, wäre 'schöner', aber nicht für die Funktion zwingend notwendig)

    Computer ..... grrrrrr

  • auf dem PI und

    Code
    Python 2.7.13 (default, Jan 19 2017, 14:48:08)
    [GCC 6.3.0 20170124] on linux2
    >>>

    So, das funktioniert:

    Computer ..... grrrrrr

    2 Mal editiert, zuletzt von Rasp-Berlin (17. Oktober 2017 um 17:12)

  • Also "12457", wenn am Montag, Dienstag, Donnerstag, Freitag und Sonntag die Ansage erfolgen soll.

    Ey, du hattest nicht gesagt, dass die Variable ein int und kein str ist! Also zwölftausendvierhundertsiebenundfünfzig statt ein String mit den Zeichen 1, 2, 4, 5 und 7. Klar geht dass dann nicht, man kann ja nicht über einen int  iterieren...

    Aber es geht ja jetzt ;)

  • Ey, du hattest nicht gesagt, dass die Variable ein int und kein str ist!

    Ist es eigentlich auch nicht - nur in seinem Versuch, da er nicht wochentag = "12457" gemacht hat.

    Wenn man einen Wert aus der Datenbank holt ist es aber vom Type str.

    Wie man aber auch an seinem "das funktioniert" sieht macht er nachträglich in der if Abfrage wochentag zum str - und verpeilt glaub ich allgemein dessen Handhabung...

    So, das funktioniert:

    Beratungsresistent...

    Wenn du dir noch mal Beitrag#7 anschaust, brauchst du nicht date.today().weekday() + 1 machen sondern kannst direkt date.today().isoweekday() verwenden, und die meisten str kannste dir auch schenken.

    Ich mag mir das aber auch nicht länger angucken - print verwendest du immer noch falsch und was soll import datetime und zusätzlich from datetime import date ? :no_sad: blinder copy&paste-Wahn?


    Python
    import datetime
    
    wtag = datetime.date.today().isoweekday()
    wochentage = "12457"
    if str(wtag) in wochentage:
        print wtag

    ODER:

    Python
    import datetime
    
    wtag = datetime.date.today().isoweekday()
    wochentage = "12457"
    if wtag in [int(c) for c in wochentage]:
        print wtag

    ODER:

    Python
    import datetime
    
    wtag = datetime.date.today().isoweekday()
    wochentage = 12457
    if str(wtag) in str(wochentage):
        print wtag

    ODER:

    Python
    import datetime
    
    wtag = datetime.date.today().isoweekday()
    wochentage = 12457
    if wtag in [int(c) for c in str(wochentage)]:
        print wtag

    (bedenke, heute ( Mittwoch ) ist wtag 3)

  • Zitat

    Wenn man einen Wert aus der Datenbank holt ist es aber vom Type str.

    Ist es dass?

    Komisch, dass es bei der im ersten Beitrag geposteten Abfrage so nicht aus der Datenbank kommt.

    Zitat

    Ich mag mir das aber auch nicht länger angucken - print verwendest du immer noch falsch

    Der Hinweis, dass ich das nur zum Testen verwendet habe, und es (mir) vollkommen egal ist, ob eine Testausgabe, die aus dem Programm wieder entfernt wird, beim Testen 'falsch' ist, solange sie den Programmablauf nicht beeinträchtigt, kann dir auch egal sein.

    Zitat

    und was soll import datetime und zusätzlich from datetime import date ? :no_sad: blinder copy&paste-Wahn?

    Warum?

    Weil es nur so funktioniert hat.

    Ja, der Grund dafür ist mir auch nicht klar.

    Wenn du einen kennst, immer her damit.

    Computer ..... grrrrrr

  • Ist es dass?

    Komisch, dass es bei der im ersten Beitrag geposteten Abfrage so nicht aus der Datenbank kommt.

    ...Ich hab dir bewusst Beispiele für alle Möglichkeiten gezeigt...

    Aber wichtiger noch:

    Du weißt selber gar nicht von welchem Type wochentag nach der Datenbankausgabe ist - und diese Unwissenheit merkt man dir bei deinen str() Orgien an.

    Die Datenbankausgabe wird mit Sicherheit nicht vom Typ int sein. Denn wenn du den Spalten-Typ (in der db) auf int oder bigint gestellt hast kommt bei cursor.fetchone()[0] ein python2-type long raus. Wenn du den Spalten-Typ auf varchar gestellt hast kommt type str raus.

    Probier es selber mal aus:

    Der Hinweis, dass ich das nur zum Testen verwendet habe, und es (mir) vollkommen egal ist, ob eine Testausgabe, die aus dem Programm wieder entfernt wird, beim Testen 'falsch' ist, solange sie den Programmablauf nicht beeinträchtigt, kann dir auch egal sein.

    Jeder andere Anfänger der hier mitließt und vielleicht auch nur copy&pasted, würde es somit falsch übernehmen und so verbreitet es sich... Auch wenn er nur mitließt und sieht das du dich dem verweigerst könnte er zB denken dass das tatsächlich egal zu sein scheint...

    Davon abgesehen macht es den Helfern irgendwann kein Spaß mehr wenn der Beholfene den Eindruck erweckt es würde ihm am Hintern vorbei gehen....

    Warum?

    Weil es nur so funktioniert hat.

    Ja, der Grund dafür ist mir auch nicht klar.

    Wenn du einen kennst, immer her damit.

    ...Ernsthaft? Weil du vermutlich date.today().weekday() verwendest bzw aufrufst ohne datetime. davor zu setzen...

    Bei mir geht es jedenfalls über die oben gezeigten Beispiele, mit nur import datetime und der Verwendung von datetime.date.today().isoweekday() ... Wenn du magst erklär Du mir den Grund.

    :2cents:

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!