Seite 1 von 1

Mehrzeiliger String und format

Verfasst: Samstag 24. Juli 2021, 19:16
von werdas34
Hallo,

für einen POST Request würde ich gerne die Daten als String Template verarbeiten. Jedoch bekomme ich das mit format nicht gebacken. Ich bekomme immer einen KeyError (KeyError: '\n "filter"'). Es sieht nach einem dictionary aus ist aber ein String. Überprüft mit type(data). Auch die geschweiten Klammern zu escapen mit einer zusätzlichen Klammer hat nicht geholfen.

Wie löst man sowas?
Ich möchte nur das date (bei on_or_after) durch das heutige Datum ausgetauscht wird.

Code: Alles auswählen

    
    today_formated = datetime.datetime.now().date().strftime('%Y-%m-%dT00:00:00Z')
    data = """
        {
            "filter": 
            {
                "and":
                [
                {
                "property": "Date",
                "date": 
                {
                    "is_not_empty": true
                }
                },
                {
                "property": "Date",
                "date": 
                {
                    "on_or_after": "{date}"
                }
                }
                ]
            }
        }
    """.format(date=today_formated)
mfg werdas34

Re: Mehrzeiliger String und format

Verfasst: Samstag 24. Juli 2021, 19:48
von Sirius3
Man formatiert sich nicht JSON-Daten von Hand zusammen, sondern benutzt ein Wörterbuch.
Beim POST-Request mit requests wird das dann automatisch in JSON umgewandelt,

Code: Alles auswählen

today_formated = datetime.datetime.now().date().strftime('%Y-%m-%dT00:00:00Z')
data = {
    "filter": {
        "and": [
            {
                "property": "Date",
                "date": {"is_not_empty": True}
            },
            {
                "property": "Date",
                "date": {"on_or_after": today_formated}
            }
        ]
    }
}
response = request.post(url, json=data)
Willst jetzt das UTC-Heute, oder ein heute, das mal in UTC auch gestern gewesen sein könnte.

Re: Mehrzeiliger String und format

Verfasst: Samstag 24. Juli 2021, 20:17
von werdas34
Danke für die hilfreiche Antwort.

Da das bei mir mit dem mehrzeiligen String funktioniert hat, wollte ich diesen modifizieren.
Ich meine es ist am Anfang ein String und wenn man es mit type() überprüft, ist es von der Klasse String. Es hat eben das Format von JSON, aber das könnte auch Zufall sein. Weshalb kann man eine String Methode nicht an einem String anwenden, nur weil es wie JSON formatiert ist?

Ich brauche das lokale Heute. Also MEZ.

Re: Mehrzeiliger String und format

Verfasst: Samstag 24. Juli 2021, 21:07
von Sirius3
Die Wahrscheinlichkeit, dass es sich nicht um JSON handelt, ist eher gering. Was sagt denn die Dokumentation des Services, den Du da ansprechen willst, dazu?
Wenn Du MEZ willst, warum gibst Du dann UTC an?

Re: Mehrzeiliger String und format

Verfasst: Samstag 24. Juli 2021, 21:32
von werdas34
Der Services erwartet JSON.
Aber das hat ja nichts mit dem Services zu tun.
Sondern das wenn in Python ein String wie ein JSON formatiert ist, aber dennoch als String klassifiziert wird, die format-Methode nicht funktioniert.
Auf ein dict kann ich keine format Methode aufrufen. Aber auf einen String schon. Und meiner Meinung nach sollte es egal sein wie der String inhaltlich aussieht.

Ich weiß nicht worauf du hinaus willst.

Code: Alles auswählen

    print(datetime.datetime.now()) # MEZ - lokale Zeit
    print(datetime.datetime.utcnow()) # UTC - lokale Zeit + 2h
    print(datetime.datetime.now(timezone.utc)) # UTC - lokale Zeit + 2h
 

Re: Mehrzeiliger String und format

Verfasst: Samstag 24. Juli 2021, 21:51
von Sirius3
Dein Problem setzt aber vor dem String an, nämlich, dass Du gar keinen String brauchst, sondern ein Wörterbuch.

Der 24.7.2021 1:30Uhr wandelst Du in 2021-07-24T00:00:00Z um, obwohl es in UTC 23.7.2021 23:30Uhr ist, und damit eigentlich 2021-07-23T00:00:00Z. Du erzeugst also mit Deiner Methode den falschen Tag.

Re: Mehrzeiliger String und format

Verfasst: Samstag 24. Juli 2021, 22:09
von rogerb
@werdas34,
Aber das hat ja nichts mit dem Services zu tun.
Sondern das wenn in Python ein String wie ein JSON formatiert ist, aber dennoch als String klassifiziert wird, die format-Methode nicht funktioniert.
Es hat nichts damit zu tun ob die der String wie ein JSON String aussieht oder nicht. Python hat Probleme mit den geschweiften Klammern, da die eine bestimmte Bedeutung haben.

Du musst sie doppeln damit Python das versteht:

Code: Alles auswählen

today_formated = datetime.datetime.now().date().strftime('%Y-%m-%dT00:00:00Z')
data = """
    {{
        "filter": 
        {{
            "and":
            [
            {{
            "property": "Date",
            "date": 
            {{
                "is_not_empty": true
            }}
            }},
            {{
            "property": "Date",
            "date": 
            {{
                "on_or_after": "{date}"
            }}
            }}
            ]
        }}
    }}
""".format(date=today_formated)
Auf ein dict kann ich keine format Methode aufrufen.
Das ist ja auch nicht nötig. Du kannst ja einfach wie in Sirius3's Beispiel die Variable direkt einsetzen

Re: Mehrzeiliger String und format

Verfasst: Sonntag 25. Juli 2021, 12:56
von __blackjack__
@werdas34: Wobei Du jetzt auch besser nicht anfängst ”JSON” mit doppelten {{ und }} zu schreiben, denn man macht das auch deswegen nicht, weil man sich verdammt leicht ungültiges JSON mit Zeichenkettenoperationen bastelt.

Wenn man mit strukturierten Daten arbeitet, sollte man die wirklich besser als Datenstruktur erstellen/manipulieren und dann am Ende zu einer Zeichenkette in Beispielsweise dem JSON-Format serialisieren, als zu versuchen strukturierte Daten selbst, in einer ”flachen” Zeichenkette zu basteln, oder noch schlimmer, zu verarbeiten.