2016-05-22 8 views
-1

In Python, ich versuche, eine XML Datei zu nehmen, zu verarbeiten, dann geben Sie die Daten auf JSON. Die XML-Verarbeitung funktioniert einwandfrei, aber ich habe Probleme beim Formatieren des JSON. Die Ausgabedatei sieht mehr wie eine Liste mit darin enthaltenen Wörterbüchern aus, was sinnvoll ist, weil der Code das tatsächlich tut. Wie kann ich dies zu einer geeigneten JSON-Datei machen?JSON in Datei schreiben - falsches Format?

filename = 'data.json' 

d = [] 

for elem in ET.fromstring(data).findall('.//table/row'): 
     field1 = elem.get('field1') 
     field2 = elem.get('field2') 
     field3 = elem.get('field3') 
     field4 = elem.get('field4') 
     l = {'field1' : field1, 
      'field2' : field2, 
      'field3' : field3, 
      'field4' : field4} 
     d.append(l) 

f_out = open(filename, 'w') 
json.dump(d, f_out) 

f_out.close() 

Die Ausgabedatei sieht wie folgt aus:

[{"field1": "field1", "field2": "field2", "field3": "field3", "field4": "field4"}, ... {"field1": "field1", "field2": "field2", "field3": "field3", "field4": "field4"}] 

Wenn ich würde erwarten, dass es aussehen:

{"field1": "field1", "field2": "field2", "field3": "field3", "field4": "field4"}, ... {"field1": "field1", "field2": "field2", "field3": "field3", "field4": "field4"} 
+0

, wenn Sie versuchen json.dump Hinzufügen indent – glls

+0

Ihr Code sieht gut aus. Ich vermute, dass die Ausgabe eine "richtige JSON-Datei" ist. Bitte zeigen Sie die Ausgabe, die Sie von diesem Programm erhalten, und welche Ausgabe Sie erwartet haben. –

+0

Sie schreiben 'd', was eine Liste ist, die in JSON als' [item1, item2, item3] 'ausgedrückt wird. –

Antwort

1

Nach the AWS docs, der Redshift COPY-Befehl eine Folge von JSON-Objekten in seiner Eingabedatei erwartet, und eine Sequenz von JSON-Objekten in seiner optionalen JSONPath-Datei.

eine solche Sequenz erstellen, rufen Sie json.dump() mehrfach:

from xml.etree import ElementTree as ET 
import json 


data = ''' 
<root><table> 
    <row field1="a" field2="b" field3="c" field4="d"/> 
    <row field1="1" field2="2" field3="3" field4="4"/> 
</table></root>''' 

filename = 'data.json' 
f_out = open(filename, 'w') 
for elem in ET.fromstring(data).findall('.//table/row'): 
     field1 = elem.get('field1') 
     field2 = elem.get('field2') 
     field3 = elem.get('field3') 
     field4 = elem.get('field4') 
     l = {'field1' : field1, 
      'field2' : field2, 
      'field3' : field3, 
      'field4' : field4} 
     json.dump(l, f_out) 
     f_out.write('\n') 

f_out.close() 

Ergebnis:

{"field2": "b", "field3": "c", "field1": "a", "field4": "d"} 
{"field2": "2", "field3": "3", "field1": "1", "field4": "4"} 
0

json.dump() hat einen Einzug und einen Trenn Parameter, die Sie möchten vielleicht Geben Sie an, ob Ihre JSON-Datei menschenlesbar sein soll.

Beispiel:

json.dump({'1': 2, '3': 4}, f_out, indent=4, separators=(',', ': ')) 

Ergebnis:

{ 
    "1": 2, 
    "3": 4 
} 

Siehe https://docs.python.org/2/library/json.html#basic-usage