Filtern in JSON Datei mit leeren Feldern

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
kjd
User
Beiträge: 12
Registriert: Freitag 12. Juli 2019, 09:48

Hallo,

ich möchte Einträge aus einer JSON Datei filtern, aber leider habe ich dabei Probleme.
So sieht ein Ausschnitt aus meiner "Beispiel" JSON Datei aus:

Code: Alles auswählen

[{
'Name': 'Otto',
'Birthday': '1990-02-01'
},
{
'Name': 'Susanne',
'Birthday': None
}]
Ich möchte nun alle Geburtstage ab 1990 und später rausfiltern und dabei die vor 1990 und die Einträge, deren Felder am Geburtstag leer sind, außen vor lassen.

Mein erster Versuch sah so aus:

Code: Alles auswählen

import json

with open("Beispiel.json", mode="r", encoding="utf8") as file:
    people = json.load(file)
    
birth = []

for entry in people:
    if int(entry['Birthday'][0:3]) >= 1990:
        birth.append(entry)
Dabei habe ich aber diese Fehlermeldung bekommen: TypeError: 'NoneType' object is not subscriptable. Also habe ich versucht None zu ersetzen.

Code: Alles auswählen

birth = []

for entry in people:
    if entry['Birthday'] == None:
        entry['Birthday'] = 0
    elif int(entry['Birthday][0:3]) >= 1990:
        birth.append(entry)
    else:
        continue
Hier bekomme ich aber eine leere Liste zurück. Ich vermute, dass es etwas mit meinem Versuch zu tun hat, None zu ersetzen. Über Hilfestellungen würde ich mich freuen!
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kjd: Nein, das hat nichts mit dem ersetzen von `None` zu tun, auch wenn *das* ziemlich unsinnig ist. Die 0 wird ja nirgends verwendet und falls doch würde es dann wirr werden weil die einen anderen Datentyp (int) hat als die anderen Geburtstage (str).

Du willst da nichts ersetzen, sondern im Falle von `None` einfach nichts machen. Also kein extra ``if`` sondern diese Bedingung einfach zusätzlich vor den Vergleich mit 1990 damit der nur ausgeführt wird wenn das Geburtsdatum gesetzt ist.

Das [0:3] ist falsch. Eine dreistellige Zahle kann halt niemals grösser oder gleich 1990 sein.

Das ``else`` mit dem ``continue`` ist überflüssig. Das passiert an der Stelle auch ohne das man irgendetwas macht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
kjd
User
Beiträge: 12
Registriert: Freitag 12. Juli 2019, 09:48

@__blackjack__ Vielen Dank für die ausführliche Erklärung!
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Code: Alles auswählen

birth = []

for entry in people:
    if entry['Birthday'] is not None and entry['Birthday'] >= "1990":
        birth.append(entry)
oder kurz, per Listcomprehension:

Code: Alles auswählen

birth = [entry for entry in people if entry['Birthday'] is not None and entry['Birthday'] >= "1990"]
Antworten