Seite 1 von 1

Filtern in JSON Datei mit leeren Feldern

Verfasst: Donnerstag 30. Juli 2020, 11:42
von kjd
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!

Re: Filtern in JSON Datei mit leeren Feldern

Verfasst: Donnerstag 30. Juli 2020, 11:50
von __blackjack__
@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.

Re: Filtern in JSON Datei mit leeren Feldern

Verfasst: Donnerstag 30. Juli 2020, 12:03
von kjd
@__blackjack__ Vielen Dank für die ausführliche Erklärung!

Re: Filtern in JSON Datei mit leeren Feldern

Verfasst: Donnerstag 30. Juli 2020, 12:16
von Sirius3

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"]