2016-08-09 162 views
-1

Wenn ich den folgenden Code verwende, erhalte ich einen Fehler, obwohl es die CSV-Datei erstellt. Ich brauche Hilfe und bin ziemlich neu bei Python.Importiere JSON zu CSV in Python

Der Fehler i erhalten ist „Traceback (letzte Anruf zuletzt): File "/home/ubuntu/workspace/parse-json.py", Zeile 34, in WERTE = [x.encode ('utf8' . für) x in Artikel [ 'Felder'] Werte()] Typeerror: String-Indizes müssen ganze Zahlen sein“

import json 
from pprint import pprint 

with open('data.json') as data_file:  
data = json.load(data_file) 

#pprint(data) 

# calc number of alert records in json file 
x = len(data['alerts']) 


count = 0 
while (count < x): 
    #print 'COUNT = ', count 
    print data['alerts'][count]['message'] 
    print data['alerts'][count]['tags'] 
    print data['alerts'][count]['teams'] 
    print data['alerts'][count]['id'] 
    count = count + 1 

import json 
import csv 

f = open('data.json') 
data = json.load(f) 
f.close() 

f = csv.writer(open('yes.csv', 'wb+')) 

for item in data: 
    values = [ x.encode('utf8') for x in item['fields'].values() ] 
    f.writerow([item['pk'], item['model']] + values) 
+0

Sind die beiden separate Dateien? Sie haben den gleichen Import zweimal. – jpmc26

+0

Außerdem können wir Ihr Problem nicht diagnostizieren, da wir Ihre Daten nicht haben. Erstellen Sie eine [MVCE] (http://stackoverflow.com/help/mcve), die vorzugsweise einen Teil von data.json direkt als Zeichenfolge verwendet, anstatt sie in einer Datei zu belassen. (Dies könnte sogar das Problem für Sie offensichtlich machen.) – jpmc26

Antwort

0

Sie benötigen Datenstrukturen zu überprüfen. Grundsätzlich ist der Fehler, dass item kein Wörterbuch ist.

Von was ich in Ihrem Code sehe, sind Sie über data iterieren, aber Daten ist keine Liste von Wörterbüchern, sondern ein Wörterbuch selbst.

Wenn Sie durch die Elemente in einem dict iterieren möchten, sollten Sie ein wie folgt vor:

for key, value in data.items(): 

oder wenn Sie wollen nur durch die Werte zu durchlaufen:

for value in data.values():