Python Anfängerfrage zu Python JSON --> Excel File

pizza4ever

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.665
Hallo,

ich fange gerade mit Python an und kämpfe noch mit den Anfangsproblemen.

Ich habe ein großes Nested JSON und möchte das in Excel Exportieren

Was ich habe ist folgendes:

1.) Wie man das JSON lädt
f = open("D:\\data.json","r")
x = f.read()
#print(x)
y = json.loads(x)

2.) Als technologie wird einem neben openpyxl auch pandas empfohlen, ich bekomme das aber als Python Anfänger nicht hin speziel der Bereich
  • wie man die ExcelFiles ausliest (in Powershell wäre das Äquivalent Get-Member bzw. Keys).
  • wie man dann durch die Sheets loopt....
  • Wie man das ganze noch am performantesten hält.

Kann mir jemand dazu helfen, damit ich einen Einstiegspunkt in das Thema bekomme?

{
"myExcelFile1": {
"mySheet1": [
{
"Name": "04-Pre1",
"Liefersystem": "yyy",
"Beschreibung": "xxx",
"Laufzeit (Sekunden)": 0.1396151,
"Status": "=HYPERLINK(\"TestResults\\ttt_04-xxx.json\",\"failed (aaa, bbb, ccc)\")"
},
{
"Name": "07-Pre1",
"Liefersystem": "yyy",
"Beschreibung": "xxx",
"Laufzeit (Sekunden)": 0.1396151,
"Status": "=HYPERLINK(\"TestResults\lkl_04-xxx.json\",\"failed (aaa, bbb, ccc)\")"
}
],
"mySheet2": [
{
"Name": "kkk-vv",
"Liefersystem": "mm",
"Beschreibung": "nn"
},
{
"Name": "aaa",
"Liefersystem": "hallohallo",
"Beschreibung": "11"
}
]
},
"myExcelFile2": {
"mySheet1": [
{
"Name": "1104-Pre1",
"Liefersystem": "ayyy",
"Beschreibung": "xbbxx",
"Laufzeit (Sekunden)": 0.1396151,
"Status": "=HYPERLINK(\"TestResults\\ttt_04-xxx.json\",\"failed (aaa, bbb, ccc)\")"
},
{
"Name": "3307-Pre1",
"Liefersystem": "ayyy",
"Beschreibung": "xbbxx",
"Laufzeit (Sekunden)": 0.1396151,
"Status": "=HYPERLINK(\"TestResults\lkl_04-xxx.json\",\"failed (aaa, bbb, ccc)\")"
}
],
"mySheet2": [
{
"Name": "kkk-vv",
"Liefersystem": "mm",
"Beschreibung": "nn"
},
{
"Name": "aaa",
"Liefersystem": "hallohallo",
"Beschreibung": "11"
}
]
}
}

Danke
 
  • Gefällt mir
Reaktionen: floTTes, RalphS und BeBur
Was ist denn dein Problem mit openpyxl? https://openpyxl.readthedocs.io/en/stable/ hat ja direkt als Beispiel fast deinen Anwendungsfall. https://openpyxl.readthedocs.io/en/stable/usage.html hilft dir auch mit den Workbooks weiter.

Performance: Der schnellste Code ist scheiße, wenn er das Falsche macht. Erst mal das Problem lösen, dann kommt die Geschwindigkeit (falls es da überhaupt ein Problem gibt).

Excel Dokument anlegen:
Code:
wb=Workbook()

Auf ein Worksheet zugreifen:
Code:
ws=wb['sheetname']

Ein Worksheet erstellen:
Code:
ws=wb.create_sheet(title='Tabelle 2')

Wie kannst du durch alle worksheets durchiterieren: https://openpyxl.readthedocs.io/en/stable/api/openpyxl.workbook.workbook.html
Code:
for i in wb.worksheets
    print(i)

BTW: Die Funktionen/Eigenschaften von worksheets sind z.B. hier dokumentiert: https://openpyxl.readthedocs.io/en/stable/api/openpyxl.worksheet.worksheet.html

BTW: @madmax2010: Excel ist ein Dateiformat. Nur eins, das von Programmierern nicht gemocht wird. Problem: Die Anwender lieben ihre Excel-Tabellen.
 
  • Gefällt mir
Reaktionen: floTTes und madmax2010
pandas ist eigentlich ideal für Arbeit mit Datensätzen. Kann nicht schaden das jetzt schon zu lernen. Zusammen mit odfpy kannst du nahezu alles von Sinn/Unsinn importieren/exportieren.

Hancock schrieb:
BTW: @madmax2010: Excel ist ein Dateiformat. Nur eins, das von Programmierern nicht gemocht wird. Problem: Die Anwender lieben ihre Excel-Tabellen.
Bei CSV ist der Delimiter aber immer pain in the ass.
Wäre schön wenn man gleich das ODS-Format nimmt. Gerade bei so einfachen funktionslosen Datensätzen, kann mittlerweile eigentlich jedes Programm mit um.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: jb_alvarado und madmax2010
Ok, gib mir ein CSV, das sowohl von einem deutschen Excel als auch von Matlab (readtable(...,'FileType','text')) korrekt eingelesen wird. (Hinweis: Unmöglich) Oder noch einfacher: Das von Excel in jeder locale richtig geöffnet wird (und Emoji's enthält).

CSV ist ein nicht-standardisiertes, nicht locale-agnostic/-aware, nicht string-save, nicht binary-save, nicht encoding-marked Speicher-"Format", das durch bessere Formate ersetzt wurde (bspw.. XML basiert (XLSX), oder standardisiert (JSON), oder binary (HDF5)).


Wikipedia beschreibt das Problem glaube ich ganz gut https://en.wikipedia.org/wiki/Comma-separated_values
The CSV file format is not fully standardized. [...] the situation gets complicated [...]
Daher: Der OP will Excel, dann gib ihm bitte nicht CSV.
 
  • Gefällt mir
Reaktionen: floTTes
Fombu schrieb:
Korrekt eingesetzt. Nein!
Korrekt? Meinst du damit Excel? Gerade wie Europäer müssen doch ständig CSV von Komma zu Semikolon übersetzen. Meine bisherigen Skripte werfen für gewöhnlich beide CSV-Versionen aus (gerade für's Fuzzing mit manueller Kontrolle).
CSV wäre prädestiniert für einfache Datensätze, wenn es da eben einen Standard geben würde ... bzw. der De-Facto-Standard (Excel) mitmachen würden.

Hancock schrieb:
Daher: Der OP will Excel, dann gib ihm bitte nicht CSV.
Du hast du natürlich Recht. Imho wäre es nur besser, die 100% offene, verständliche Alternative ODS zu nutzen. Excel kann seit 2010 ODS lesen (glaube ich).
 
Zuletzt bearbeitet:
Sorry dass ich nicht mehr reagiert habe. Konnte das Problem derweil selbst lösen. Wichtig war (in meienem Fall) dass man xlsxwriter statt openpyxl nimmt weil openpyxl probleme mit unicode escapes hat. Das Problem wird bei stackoverflow auch diskutiert.

Ich habe folgendes Skript verwendet:
Code:
import pandas as pd
import json
import sys as sys

f = open("D:\\pythonTest\\data.json", mode="r", encoding="utf-8")
x = f.read()
y = json.loads(x)

for file in y.keys():
    filename = file + '.xlsx'
    writer = pd.ExcelWriter(filename, engine='xlsxwriter')
    for sheet in y[file].keys():
        df = pd.json_normalize(y[file][sheet])
        df.to_excel(writer, sheet_name=sheet)
    writer.save()


p.s.: CSV ist Mist, vorallem weil es keine NULL Values gibt und vieles Abhängig von der Implementierung ist.
Und CSV ist bei 40 Tabellenblättern auch keine wirkliche Option....

Wen es interessiert. Die Python Implementierung ist in dem Fall erheblich (vielleicht >100 mal) schneller als die Powershell Implementierung mit ImportExcel; weil Import Excel immer nur ein Tabellenblatt in den Writer lässt.

Man könnte zwar mit den COM Objekten arbeiten, aber dafür braucht man eine Excel Installation.

Alternativ gibt es noch etliche .net DLLs, die man anbinden könnte, aber die meisten davon sind kostenpflichtig.

Daher der Umweg von Powershell --> JSON Export --> Python Verarbeitung


 
Zurück
Oben