Von JSON zu Excel mit Python

In diesem Tutorial geht es um das Laden eines JSON-Datensatzes, um diese Daten dann in einer Excel-Datei zu speichern (mithilfe von openpyxl).

JSON-Daten laden

Bei dem Datensatz handelt es sich um das Ergebnis der Wahl zum Unterhaus im Vereinigten Königreich (UK General Election 2019). Diese Daten können über folgende URL abgerufen werden:

https://xern-statistic.de/api/election

{
    "Conservative Party": 365,
    "Labour Party": 203,
    "Scottish National Party": 48,
    "Liberal Democrats": 11,
    "Democratic Unionist Party": 8,
    "Sinn Féin": 7,
    "Plaid Cymru": 4,
    "Green Party": 1,
    "Brexit Party": 0,
    "UK Independence Party": 0,
    "Other Parties": 3
}

Für den Abruf der Daten soll die Bibliothek requests genutzt werden. Den Anfang macht also eine entsprechende Import-Anweisung:

import requests

Darüber hinaus wird noch sys benötigt:

import sys

Es folgt die URL, die der Variablen URL zugewiesen wird:

URL = "https://xern-statistic.de/api/election"

Für den Abruf der Daten wird die Funktion fetch_json_data(json_url) genutzt, der als Argument die URL übergeben wird:

def fetch_json_data(json_url):
    """Fetch JSON data from xern-statistic

    Arguments:
        json_url {str} -- The API url

    Returns:
        dict -- JSON data (UK election 2019)
    """

    # Connect to the server
    try:
        response = requests.get(json_url)
    except OSError as e:
        print("Error: {0}".format(e))
        sys.exit(0)

    # Check if the status code is OK
    # and receive data
    if response.status_code == 200:
        print("Status 200, OK")
        return response.json()
    else:
        print("JSON data request not successfull!")
        sys.exit(0)

Die eigentliche Arbeit verrichtet die Methode requests.get(json_url). Da nicht ausgeschlossen ist, dass dabei etwas schief geht, ist sie in eine Ausnahmebehandlung eingebettet.

Als nächstes wird der Status-Code überprüft. Nur bei der Rückgabe von Code 200 (OK), geht es weiter.

Sollte die Abfrage scheitern, beendet sys.exit() das Programm.

Da das Dokumentieren von Code immer eine gute Sache ist, habe ich der Funktion noch einen Docstring spendiert.

Schließlich muss diese Funktion auch aufgerufen werden. Und falls keine Fehler auftreten, sollen die Werte selbstverständlich auch ausgegeben werden.

json_data = fetch_json_data(URL)
pprint(json_data)

Der Anfang ist damit gemacht. Im zweiten Teil sollen die Daten dann als Excel-Datei gespeichert werden.

Daten als Excel-Datei speichern

Hinweis In diesem Tutorial wird nur das Speichern im Excel-Format behandelt. Das Lesen von Excel-Dateien wird in diesem Artikel erklärt.

In diesem Beispiel verwende ich die Bibliothek openpyxl:

import openpyxl

Zunächst wird ein Arbeitsmappe (Workbook) geöffnet, das erste Arbeitsblatt (Sheet) aktiviert und diesem Arbeitsblatt sodann die Bezeichnung “UK Election 2019” gegeben:

workbook = openpyxl.Workbook()
sheet = workbook.active
sheet.title = 'UK Election 2019'

Optional kann man das Aussehen verändern, wobei man diesbezüglich folgende Import-Anweisung hinzufügen muss:

from openpyxl.styles import Font

In den Zellen A1 und B1 stehen die Überschriften “Parties” und “Seats”, die die Schriftgröße 16 haben und fett sein sollen:

bold16font = Font(size=16, bold=True)

sheet['A1'] = 'Party'
sheet['A1'].font = bold16font

sheet['B1'] = 'Seats'
sheet['B1'].font = bold16font

Eine for-Schleife liest die Daten und speichert die Schlüssel in der Liste “parties” und die Werte in der Liste “seats”:

# Create two lists (keys, values)
parties = list(data.keys())
seats = list(data.values())

Die Daten werden erst ab der zweiten Zeile, also “A2” und “B2” eingetragen. Diese lege ich hier mit den Variablen party_row und seats_row fest:

party_row = 2
seats_row = 2

Anschließend werden die Werte aus den Listen parties und seats den Zellen zugeordnet:

# Write data to 1st column
for party in parties:
    sheet.cell(row=party_row, column=1).value = party
    party_row += 1

# Write data to 2nd column
for seat in seats:
    sheet.cell(row=seats_row, column=2).value = seat
    seats_row += 1

Und schließlich erfolgt das Speichern der Excel-Datei mit der Zeile:

workbook.save('UK-Election-2019.xlsx')

Das ganze habe ich übrigens in einer Funktion mit der Bezeichnung write_excel() verpackt, die so aussieht:

def write_excel(data):
    """Write data to an Excel file.

    Args:
        data (dict): The JSON data
    """

    # Call openpyxl.Workbook() to create a new blank Excel workbook
    workbook = openpyxl.Workbook()

    # Activate a sheet
    sheet = workbook.active

    # Set a title
    sheet.title = 'UK Election 2019'

    # Headline style
    bold16font = Font(size=16, bold=True)

    # Add headlines (1st and 2nd column)
    sheet['A1'] = 'Party'
    sheet['A1'].font = bold16font

    sheet['B1'] = 'Seats'
    sheet['B1'].font = bold16font

    # Add JSON data
    for key, value in data.items():
        parties.append(key)
        seats.append(value)

    party_row = 2

    # Write data to 1st column
    for party in parties:
        sheet.cell(row=party_row, column=1).value = party
        party_row += 1

    seats_row = 2

    # Write data to 2nd column
    for seat in seats:
        sheet.cell(row=seats_row, column=2).value = seat
        seats_row += 1

    # Save the workbook (excel file)
    workbook.save('UK-Election-2019.xlsx')

Den vollständigen Code findet Ihr zum Herunterladen bei Github.

Weiterführende Links