2016-09-09 4 views
0

Ich möchte geschachtelte JSON in Excel-Dateiformat mit Python konvertieren. Ich habe fast wie pro Anforderungen gemacht, aber ich möchte Excel-Format wie folgt erreichen.Konvertieren geschachtelten JSON nach Excel mit Python

JSON

[ 
 
    { 
 
    "url": "https://www.amazon.com/Best-Sellers-Appliances-Cooktops/zgbs/appliances/3741261", 
 
    "subCategory": [ 
 
     
 
    ], 
 
    "title": "Cooktops" 
 
    }, 
 
    { 
 
    "url": "https://www.amazon.com/Best-Sellers-Appliances-Dishwashers/zgbs/appliances/3741271", 
 
    "subCategory": [ 
 
     { 
 
     "url": "https://www.amazon.com/Best-Sellers-Appliances-Built-Dishwashers/zgbs/appliances/3741281", 
 
     "subCategory": [ 
 
      
 
     ], 
 
     "title": "Built-In Dishwashers" 
 
     }, 
 
     { 
 
     "url": "https://www.amazon.com/Best-Sellers-Appliances-Portable-Countertop-Dishwashers/zgbs/appliances/3741301", 
 
     "subCategory": [ 
 
      
 
     ], 
 
     "title": "Portable & Countertop Dishwashers" 
 
     } 
 
    ], 
 
    "title": "Dishwashers" 
 
    }, 
 
    { 
 
    "url": "https://www.amazon.com/Best-Sellers-Appliances-Freezers/zgbs/appliances/3741331", 
 
    "subCategory": [ 
 
     { 
 
     "url": "https://www.amazon.com/Best-Sellers-Appliances-Chest-Freezers/zgbs/appliances/3741341", 
 
     "subCategory": [ 
 
      
 
     ], 
 
     "title": "Chest Freezers" 
 
     }, 
 
     { 
 
     "url": "https://www.amazon.com/Best-Sellers-Appliances-Upright-Freezers/zgbs/appliances/3741351", 
 
     "subCategory": [ 
 
      
 
     ], 
 
     "title": "Upright Freezers" 
 
     } 
 
    ], 
 
    "title": "Freezers" 
 
    }, 
 
    { 
 
    "url": "https://www.amazon.com/Best-Sellers-Appliances-Ice-Makers/zgbs/appliances/2399939011", 
 
    "subCategory": [ 
 
     
 
    ], 
 
    "title": "Ice Makers" 
 
    }, 
 
    { 
 
    "url": "https://www.amazon.com/Best-Sellers-Appliances-Range-Hoods/zgbs/appliances/3741441", 
 
    "subCategory": [ 
 
     
 
    ], 
 
    "title": "Range Hoods" 
 
    }, 
 
    { 
 
    "url": "https://www.amazon.com/Best-Sellers-Appliances-Ranges/zgbs/appliances/3741411", 
 
    "subCategory": [ 
 
     { 
 
     "url": "https://www.amazon.com/Best-Sellers-Appliances-Drop-Ranges/zgbs/appliances/3741421", 
 
     "subCategory": [ 
 
      
 
     ], 
 
     "title": "Drop-In Ranges" 
 
     }, 
 
     { 
 
     "url": "https://www.amazon.com/Best-Sellers-Appliances-Freestanding-Ranges/zgbs/appliances/3741431", 
 
     "subCategory": [ 
 
      
 
     ], 
 
     "title": "Freestanding Ranges" 
 
     }, 
 
     { 
 
     "url": "https://www.amazon.com/Best-Sellers-Appliances-Slide-Ranges/zgbs/appliances/2399946011", 
 
     "subCategory": [ 
 
      
 
     ], 
 
     "title": "Slide-In Ranges" 
 
     } 
 
    ], 
 
    "title": "Ranges" 
 
    }, 
 
    { 
 
    "url": "https://www.amazon.com/Best-Sellers-Appliances-Refrigerators/zgbs/appliances/3741361", 
 
    "subCategory": [ 
 
     
 
    ], 
 
    "title": "Refrigerators" 
 
    }, 
 
    { 
 
    "url": "https://www.amazon.com/Best-Sellers-Appliances-Wall-Ovens/zgbs/appliances/3741481", 
 
    "subCategory": [ 
 
     { 
 
     "url": "https://www.amazon.com/Best-Sellers-Appliances-Combination-Microwave-Wall-Ovens/zgbs/appliances/3741491", 
 
     "subCategory": [ 
 
      
 
     ], 
 
     "title": "Combination Microwave & Wall Ovens" 
 
     }, 
 
     { 
 
     "url": "https://www.amazon.com/Best-Sellers-Appliances-Double-Wall-Ovens/zgbs/appliances/3741501", 
 
     "subCategory": [ 
 
      
 
     ], 
 
     "title": "Double Wall Ovens" 
 
     }, 
 
     { 
 
     "url": "https://www.amazon.com/Best-Sellers-Appliances-Single-Wall-Ovens/zgbs/appliances/3741511", 
 
     "subCategory": [ 
 
      
 
     ], 
 
     "title": "Single Wall Ovens" 
 
     } 
 
    ], 
 
    "title": "Wall Ovens" 
 
    }, 
 
    { 
 
    "url": "https://www.amazon.com/Best-Sellers-Appliances-Warming-Drawers/zgbs/appliances/2399955011", 
 
    "subCategory": [ 
 
     
 
    ], 
 
    "title": "Warming Drawers" 
 
    }, 
 
    { 
 
    "url": "https://www.amazon.com/Best-Sellers-Appliances-Washers-Dryers/zgbs/appliances/2383576011", 
 
    "subCategory": [ 
 
     { 
 
     "url": "https://www.amazon.com/Best-Sellers-Appliances-Clothes-Dryers/zgbs/appliances/13397481", 
 
     "subCategory": [ 
 
      
 
     ], 
 
     "title": "Dryers" 
 
     }, 
 
     { 
 
     "url": "https://www.amazon.com/Best-Sellers-Appliances-Clothes-Washing-Machines/zgbs/appliances/13397491", 
 
     "subCategory": [ 
 
      
 
     ], 
 
     "title": "Washers" 
 
     }, 
 
     { 
 
     "url": "https://www.amazon.com/Best-Sellers-Appliances-Combination-Washers-Dryers/zgbs/appliances/13755271", 
 
     "subCategory": [ 
 
      
 
     ], 
 
     "title": "All-in-One Combination Washers & Dryers" 
 
     }, 
 
     { 
 
     "url": "https://www.amazon.com/Best-Sellers-Appliances-Stacked-Washer-Dryer-Units/zgbs/appliances/2399957011", 
 
     "subCategory": [ 
 
      
 
     ], 
 
     "title": "Stacked Washer & Dryer Units" 
 
     } 
 
    ], 
 
    "title": "Washers & Dryers" 
 
    }, 
 
    { 
 
    "url": "https://www.amazon.com/Best-Sellers-Appliances-Wine-Cellars/zgbs/appliances/3741521", 
 
    "subCategory": [ 
 
     { 
 
     "url": "https://www.amazon.com/Best-Sellers-Appliances-Built-Wine-Cellars/zgbs/appliances/3741551", 
 
     "subCategory": [ 
 
      
 
     ], 
 
     "title": "Built-In Wine Cellars" 
 
     }, 
 
     { 
 
     "url": "https://www.amazon.com/Best-Sellers-Appliances-Freestanding-Wine-Cellars/zgbs/appliances/3741541", 
 
     "subCategory": [ 
 
      
 
     ], 
 
     "title": "Freestanding Wine Cellars" 
 
     }, 
 
     { 
 
     "url": "https://www.amazon.com/Best-Sellers-Appliances-Furniture-Style-Wine-Cellars/zgbs/appliances/3741561", 
 
     "subCategory": [ 
 
      
 
     ], 
 
     "title": "Furniture-Style Wine Cellars" 
 
     }, 
 
     { 
 
     "url": "https://www.amazon.com/Best-Sellers-Appliances-Small-Wine-Cellars/zgbs/appliances/3741531", 
 
     "subCategory": [ 
 
      
 
     ], 
 
     "title": "Small Wine Cellars" 
 
     }, 
 
     { 
 
     "url": "https://www.amazon.com/Best-Sellers-Appliances-Wine-Cellar-Cooling-Systems/zgbs/appliances/3741581", 
 
     "subCategory": [ 
 
      
 
     ], 
 
     "title": "Wine Cellar Cooling Systems" 
 
     }, 
 
     { 
 
     "url": "https://www.amazon.com/Best-Sellers-Appliances-Wine-Rooms/zgbs/appliances/3741571", 
 
     "subCategory": [ 
 
      
 
     ], 
 
     "title": "Wine Rooms" 
 
     } 
 
    ], 
 
    "title": "Wine Cellars" 
 
    }, 
 
    { 
 
    "url": "https://www.amazon.com/Best-Sellers-Appliances-Home-Appliance-Warranties/zgbs/appliances/2242350011", 
 
    "subCategory": [ 
 
     
 
    ], 
 
    "title": "Appliance Warranties" 
 
    } 
 
]

ich durchqueren alle Subkategorien wie folgt aus:

row = 1 

def TraverseJSONTree(jsonObject, count=0): 
    title = jsonObject.get('title') 
    url = jsonObject.get('url') 

    print 'Title: ' + title + ' , Position: ' + str(count) 

    worksheet.write_string(row, count, title) 
    worksheet.write_string(row, 6, url) 
    global row 
    row+=1 

    subCategories = jsonObject.get('subCategory',[]) 

    for category in subCategories: 
     TraverseJSONTree(category, count+1) 


for jsonObject in json.loads(jsonArray): 
    TraverseJSONTree(jsonObject) 

enter image description here

Erwartetes Ergebnis

enter image description here

+0

Es wird mit [Pandas] einfach sein (http://stackoverflow.com/questions/29196668/mapping-a-json-file-to-excel-with- Python) – bhansa

+0

Können Sie mir sagen, wie? Ich habe es geschafft, fast wie pro Anforderung zu tun. Ich bin ein Neuling in Python –

Antwort

0

Modifikation: einfachste Weg, dies zu tun wäre, csv-Modul zu verwenden, sagen wir die ganze json in der Variablen haben eine

import csv 
import cPickle as pickle 

fieldnames = ['Category1', 'Category1.1', 'url'] 
csvfile = open("category.csv", 'wb') 
csvfilewriter = csv.DictWriter(csvfile, fieldnames=fieldnames,dialect='excel', delimiter=',') 
csvfilewriter.writeheader() 

for b in a:  
    data = [] 
    data.append(b['title']) 
    data.append("") 
    data.append(b['url']) 
    csvfilewriter.writerow(dict(zip(fieldnames,data))) 
    data = [] 
    for i in xrange(len(b['subCategory'])): 
     data.append(b['title']) 
     data.append(b['subCategory'][i]['title']) 
     data.append(b['subCategory'][i]['url']) 
     csvfilewriter.writerow(dict(zip(fieldnames,data))) 

Sie die gewünschte haben wird CSV am selben Ort. Dies funktioniert nur für zwei Unterkategorien (weil ich die von Ihnen angegebenen Daten überprüft habe und sage, dass es nur zwei Kategorien gibt (dh 1 und 1.1)), aber für den Fall, dass Sie mehr als dasselbe wollen (ich weiß, dass es nicht der effizienteste Weg ist) könnte denken nicht so kurzer Zeit von jeder in)

Sie auch Pandas Modul konvertiert die Wörterbuch Import Pandas als pd pd.DataFrame.from_dict (dcitionaty_element)

Und dann tun Sie es auf alle verwenden können die Wörterbücher in diesem json und führen sie zusammen und speichern sie in einer CSV-Datei.

+1

Bitte stellen Sie die Arbeitslösung –

+0

kann dies funktionieren, wenn es Unterkategorien von Unterkategorien gibt? –

+0

Wenn Sie wissen, was sind max Unterkategorien, das kann ich tun, nur die For-Schleife erneut verwenden müssen. –

1
row = 1 

def TraverseJSONTree(jsonObject, main_title=None, count=0): 
    if main_title is None: 
     main_title = title = jsonObject.get('title') 
    else: 
     title = jsonObject.get('title') 
    url = jsonObject.get('url') 

    print 'Title: ' + title + ' , Position: ' + str(count) 

    if main_title is not None: 
     worksheet.write_string(row, 0, title) 
    worksheet.write_string(row, count, title) 
    worksheet.write_string(row, 6, url) 
    global row 
    row+=1 

    subCategories = jsonObject.get('subCategory',[]) 

    for category in subCategories: 
     TraverseJSONTree(category, main_title, count+1) 

for jsonObject in json.loads(jsonArray): 
    TraverseJSONTree(jsonObject) 

wird es Ihre erwartete Ausgabe zurück, wie es einen Scheck muss, wenn Kategorie gibt es dann haben Sie den Originaltitel auf der 0-ten Spalte in Excel Reamin als gleich rechts.

+0

Es gibt nicht die gewünschte Ausgabe wie oben erwähnt. Ich habe Ihr Skript überprüft und gebe Folgendes an: https://docs.google.com/spreadsheets/d/1BBlXNiCqn-Z19cCSK_kzpS4fpy4Rknek2ubyvEj4c5E/edit?usp=sharing –

+0

Alles, was ich brauche, sollte so aussehen: https: // docs. google.com/spreadsheets/d/1TT5alzmW9tMSR1sOFoi1YgYz_IwnTGUVhh1esHhk8QM/edit?usp=sharing und es sollte funktionieren, wenn es weitere Unterkategorien von Unterkategorien gibt. –

+1

Ahh dummer Fehler aktualisiere Titel mit main_title in folgender Zeile: wenn main_title nicht ist Keiner: worksheet.write_string (row, 0, main_title) –

0

können Sie die verfügbaren Python-Code verwenden here

Verwandte Themen