2017-10-31 7 views
-1

Ich habe eine JSON-Datei mit diesen DatenWie entfernen Sie Null, falsche Werte aus der JSON-Datei?

{ 

    "in_reply_to_screen_name": null, 
    "favorited": false, 
    "id_str": "92", 
    "entities": { 
     "user_mentions": [], 
     "symbols": [], 
     "urls": [], 
     "hashtags": [ 
      { 
       "indices": [0,8] 
      } 
     ] 
    }, 
    "geo": null, 
    "user": { 
     "verified": false, 
     "notifications": null, 
     "profile_sidebar_border_color": "FFFFFF", 
     "geo_enabled": true, 
     "profile_background_tile": true, 
     "url": null, 
     "id": 278, 
     "default_profile": false, 
     "lang": "pt", 
     "location": null, 
     "translator_type": "none", 
     "protected": false 
    }, 
    "id": 92, 
    "in_reply_to_status_id_str": null, 
    "in_reply_to_status_id": null, 
    "created_at": "Tue Oct", 
    "is_quote_status": false, 
    "text": "This is a vdd", 
    "truncated": false, 
    "retweeted": false 
} 

Wie kann ich alle Schlüssel-Wert-Paare löschen, die null, falsch und wahr diese Datei enthalten, mit Python?

Diese Werte können in verschiedenen Ebenen der Datenstruktur auftreten.

+0

Was Sie bisher versucht haben? –

+0

Neugierig, dass der Titel "Null, falsch" (d. H. "Falsy") Werte erwähnt, aber der Fragetext sagt "null, falsch ** und wahr **". Welches ist es? – alexis

+0

@KevinJohnson, diese Schritte zum Beispiel: mit offenem (arq_geral, 'r') als f: für Zeile in f: tweet = json.loads (line) dados_tweet.append (tweet) für tweet in dados_tweet : wenn tweet ["geo"]: del tweet ["geo"] Es entfernt nicht zum Beispiel das 'geo'. –

Antwort

4

Durch Decodierung, rekursives Bearbeiten des Objekts und erneutes Codieren zu JSON.

Ich mag für solche Aufgaben single dispatch verwenden:

from functools import singledispatch 

@singledispatch 
def remove_null_bool(ob): 
    return ob 

@remove_null_bool.register(list) 
def _process_list(ob): 
    return [remove_null_bool(v) for v in ob] 

@remove_null_bool.register(dict) 
def _process_list(ob): 
    return {k: remove_null_bool(v) for k, v in ob.items() 
      if v is not None and v is not True and v is not False} 

data = json.load(source) 
json.dump(dest, remove_null_bool(data)) 

I verwendet is not False usw. für die genauen Objekte zu testen. Hätte ich v not in {None, False, True} verwendet, würden die ganzzahligen Werte 0 und 1 ebenfalls entfernt werden, da False und True jeweils diesen Werten entsprechen.

Demo gegen Ihre Probe geladen data:

>>> print(json.dumps(remove_null_bool(data), indent=4, sort_keys=True)) 
{ 
    "created_at": "Tue Oct", 
    "entities": { 
     "hashtags": [ 
      { 
       "indices": [ 
        0, 
        8 
       ] 
      } 
     ], 
     "symbols": [], 
     "urls": [], 
     "user_mentions": [] 
    }, 
    "id": 92, 
    "id_str": "92", 
    "text": "This is a vdd", 
    "user": { 
     "id": 278, 
     "lang": "pt", 
     "profile_sidebar_border_color": "FFFFFF", 
     "translator_type": "none" 
    } 
} 
+0

beim Ausführen erkennt es 'dest' nicht. NameError: Name 'dest' ist nicht definiert sollte dies in diesem Programm auftreten? Oder war es mein Fehler? file = open ('file_ok.json', 'w') #file um korrekte Daten zu schreiben file_data = 'file_data.json' #JSON Datei mit null, false und true Werten mit open (file_data, 'r') as f: für Zeile in f: data = json.loads (line) file.write (json.dump (dEST, remove_null_bool (Daten))) file.write ('\ n') file.close() –

+0

@Rennan, wo würdest du 'dest' herkommen? Sieh dir den Code an, schau nach 'json.dump()' und du kannst deine eigene Frage beantworten. – alexis

+0

@ RennanCéosGleyson Ich illustrierte; Stellen Sie Ihre eigenen Eingabe- und Ausgabedateiobjekte zur Verfügung. –

Verwandte Themen