Mehrzeiliger String und format

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
werdas34
User
Beiträge: 11
Registriert: Mittwoch 21. März 2018, 15:15

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
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
werdas34
User
Beiträge: 11
Registriert: Mittwoch 21. März 2018, 15:15

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.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
werdas34
User
Beiträge: 11
Registriert: Mittwoch 21. März 2018, 15:15

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
 
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@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
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten