2016-07-19 10 views
0

Ich habe ein besonderes Problem mit JSON-Dateien. Der folgende Code liest json und schreibt in eine txt-Datei. Ich habe den Code für die Lesbarkeit gekürzt, in meinem echten Code sind es Hunderte von Feldern und Schreibanweisungen.wie file.write() eine leere Zeichenfolge, wenn Wörterbuch erzeugt einen KeyError in Python

import os 
import json 


def _getjson(filename): 
    """ returns a list of dictionaries """ 
    if not os.path.exists(filename): return [] 
    with open(filename, 'r') as openfileobject: 
     data = json.loads(openfileobject.read()) 
    return data 

def writefile(filename, data): 
    """writes to file""" 
    with open(filename, 'w') as f: 
     for d in data: 
      f.write(d['field1'] + ' ' + d['field2'] + ' ' + d['field3'] + '\n') 
      ## a lot more code here 


def main(): 
    filename = r'c:\input.json' 
    data = _getjson(filename) 
    outfile = r'c:\output.txt' 
    writefile(outfile, data) 

if __name__ == '__main__': 
    main() 

Das Problem ist, manchmal ist ein Feld nicht in json, und es entsteht ein KeyError Während ich kann diese Falle mit einem try: except KeyError. Es würde bedeuten, dass ich diesen Versuch um jedes Feld in meiner writefile Funktion versuchen muss.

Gibt es einen Weg, ohne die f.write() Aussagen zu ändern, dass auf KeyError wird es eine leere Zeichenfolge schreiben? (also muss ich das nicht in Hunderte von try Blöcke erfassen)

Also das ist ein Wörterbuch Problem, ich habe kein Problem mit dem JSON selbst. Ich kann nicht kontrollieren, welche Felder in meiner Eingabe sind, also kann eine Datei field1 und field2 haben. Der nächste könnte alle drei oder nur einen haben. Der JSON-Teil funktioniert, nur dass mir manchmal Felder fehlen.

Antwort

3

Verwendung dict.get:

f.write(d.get('field1', '') + ' ' + 
     d.get('field2', '') + ' ' + 
     d.get('field3', '') + '\n') 

get() gibt den Wert für Schlüssel oder Standard oder None gegeben.

+0

Vielen Dank! Das hat den Trick gemacht! –

+1

Sie könnten auch die Idee 'join()' auch darauf anwenden: 'f.write ('' .join (d.get (k, '') für k in ['field1', 'field2', 'field3 ']) +' \ n ') ' –

2

Einfacher ist str.join mit dict.values.

f.write(' '.join(d.values()))

oder wenn Werte nicht Strings verwenden genexps wie

f.write(' '.join(str(value) for value in d.values()))

+0

' d.values ​​() 'hat eine beliebige Reihenfolge, oder anders gesagt, keine Reihenfolge. Das ist vielleicht egal, aber die meiste Zeit ist es so. –

+0

'dict.values ​​()' funktioniert nicht für mich, da ich nicht den genauen Schlüssel auswählen kann, den ich in die Datei schreiben möchte (und formatiere und lege anderen Text herum) ... aber danke für deine Antwort, ich habe eine andere gelernt Trick, den ich in Zukunft nutzen werde! –