Konvertieren Sie verschachteltes JSON in CSV in Python
In diesem Artikel werden wir erörtern, wie wir verschachteltes JSON in Python in CSV konvertieren können.
Ein Beispiel für eine einfache JSON-Datei:
Wie Sie im Beispiel sehen können, wird ein einzelnes Schlüsselwertpaar durch einen Doppelpunkt (:) getrennt, während alle Schlüsselwertpaare durch ein Komma (,) getrennt werden. Hier sind „Name“, „Profil“, „Alter“ und „Standort“ die Schlüsselfelder, während die entsprechenden Werte „ Amit Pathak “, „ Software Engineer “, „24“, „London, UK“ lauten.
Ein verschachteltes JSON ist eine Struktur, in der der Wert für ein oder mehrere Felder ein anderes JSON-Format haben kann. Folgen Sie beispielsweise dem folgenden Beispiel, das wir zum Konvertieren in das CSV-Format verwenden werden.
Ein Beispiel für eine verschachtelte JSON-Datei:
Im obigen Beispiel hat das Schlüsselfeld „ Artikel “ einen Wert, der ein anderes JSON-Format ist. JSON unterstützt mehrere Verschachtelungen, um bei Bedarf komplexe JSON-Dateien zu erstellen.
Verschachtelte JSON-zu-CSV-Konvertierung
Unsere Aufgabe ist es, die JSON-Datei in ein CSV-Format zu konvertieren. Es kann viele Gründe geben, warum wir diese Konvertierung durchführen müssen. CSV sind einfach zu lesen, wenn sie in einer Tabellenkalkulations-GUI-Anwendung wie Google Sheets oder MS Excel geöffnet werden. Sie sind für Datenanalyseaufgaben einfach zu handhaben. Es ist auch ein weithin akzeptiertes Format bei der Arbeit mit tabellarischen Daten, da es im Gegensatz zum JSON-Format für Menschen leicht zu sehen ist.
Sich nähern
- Der erste Schritt besteht darin, die JSON-Datei als Python-Dict-Objekt zu lesen. Dies wird uns helfen, Python-Dict-Methoden zu verwenden, um einige Operationen auszuführen. Für die Aufgabe wird die Funktion read_json() verwendet, die den Dateipfad zusammen mit der Erweiterung als Parameter verwendet und den Inhalt der JSON-Datei als Python-Dict-Objekt zurückgibt.
- Wir normalisieren das dict-Objekt mit der Funktion normalize_json() . Es sucht nach Schlüssel-Wert-Paaren im dict-Objekt. Wenn der Wert wieder ein Diktat ist, wird die Schlüsselzeichenfolge mit der Schlüsselzeichenfolge des verschachtelten Diktats verkettet.
- Die gewünschten CSV-Daten werden mit der Funktion generate_csv_data() erstellt . Diese Funktion verkettet jeden Datensatz mit einem Komma (,) und dann werden alle diese einzelnen Datensätze mit einer neuen Zeile ('\n' in Python) angehängt.
- Im letzten Schritt schreiben wir die im vorherigen Schritt generierten CSV-Daten an einen bevorzugten Speicherort, der durch den filepath- Parameter bereitgestellt wird.
Verwendete Datei: Datei „article.json“.
{ "article_id": 3214507, "article_link": "http://sample.link", "published_on": "17-Sep-2020", "source": "moneycontrol", "article": { "title": "IT stocks to see a jump this month", "category": "finance", "image": "http://sample.img", "sentiment": "neutral" } }
Beispiel: Konvertieren von JSON in CSV
Python
import json def read_json(filename: str) -> dict: try: with open(filename, "r") as f: data = json.loads(f.read()) except: raise Exception(f"Reading {filename} file encountered an error") return data def normalize_json(data: dict) -> dict: new_data = dict() for key, value in data.items(): if not isinstance(value, dict): new_data[key] = value else: for k, v in value.items(): new_data[key + "_" + k] = v return new_data def generate_csv_data(data: dict) -> str: # Defining CSV columns in a list to maintain # the order csv_columns = data.keys() # Generate the first row of CSV csv_data = ",".join(csv_columns) + "\n" # Generate the single record present new_row = list() for col in csv_columns: new_row.append(str(data[col])) # Concatenate the record with the column information # in CSV format csv_data += ",".join(new_row) + "\n" return csv_data def write_to_file(data: str, filepath: str) -> bool: try: with open(filepath, "w+") as f: f.write(data) except: raise Exception(f"Saving data to {filepath} encountered an error") def main(): # Read the JSON file as python dictionary data = read_json(filename="article.json") # Normalize the nested python dict new_data = normalize_json(data=data) # Pretty print the new dict object print("New dict:", new_data) # Generate the desired CSV data csv_data = generate_csv_data(data=new_data) # Save the generated CSV data to a CSV file write_to_file(data=csv_data, filepath="data.csv") if __name__ == '__main__': main()
Ausgabe:
Dasselbe kann durch die Verwendung von Pandas Python-Bibliothek erreicht werden. Pandas ist eine kostenlose Python-Quellbibliothek, die zur Datenmanipulation und -analyse verwendet wird. Es führt Operationen aus, indem es die Daten in ein pandas.DataFrame -Format konvertiert. Es bietet viele Funktionalitäten und Operationen, die auf dem Datenrahmen ausgeführt werden können.
Sich nähern
- Der erste Schritt besteht darin, die JSON-Datei als Python-Dict-Objekt zu lesen. Dies wird uns helfen, Python-Dict-Methoden zu verwenden, um einige Operationen auszuführen. Für die Aufgabe wird die Funktion read_json() verwendet, die den Dateipfad zusammen mit der Erweiterung als Parameter verwendet und den Inhalt der JSON-Datei als Python-Dict-Objekt zurückgibt.
- Wir normalisieren das dict-Objekt mit der Funktion normalize_json() . Es sucht nach Schlüssel-Wert-Paaren im dict-Objekt. Wenn der Wert wieder ein Diktat ist, wird die Schlüsselzeichenfolge mit der Schlüsselzeichenfolge des verschachtelten Diktats verkettet.
- In diesem Schritt verwenden wir die Methode pandas.DataFrame() , anstatt manuelle Anstrengungen zu unternehmen, um einzelne Objekte als jeden Datensatz der CSV anzuhängen . Es nimmt das dict-Objekt auf und generiert die gewünschten CSV-Daten in Form des pandas DataFrame-Objekts. Eine Sache im obigen Code ist erwähnenswert, dass die Werte der dict-Variable „ new_data “ in einer Liste vorhanden sind. Der Grund dafür ist, dass beim Übergeben eines Wörterbuchs zum Erstellen eines Pandas-Datenrahmens die Werte des Diktats eine Liste von Werten sein müssen, wobei jeder Wert den Wert darstellt, der in jeder Zeile für diesen Schlüssel- oder Spaltennamen vorhanden ist. Hier haben wir eine einzelne Zeile.
- Wir verwenden die Methode pandas.DataFrame.to_csv() , die den Pfad zusammen mit dem Dateinamen, in dem Sie die CSV speichern möchten, als Eingabeparameter übernimmt und die generierten CSV-Daten in Schritt 3 als CSV speichert.
Beispiel: Konvertierung von JSON in CSV mit Pandas
Python
import json import pandas def read_json(filename: str) -> dict: try: with open(filename, "r") as f: data = json.loads(f.read()) except: raise Exception(f"Reading {filename} file encountered an error") return data def normalize_json(data: dict) -> dict: new_data = dict() for key, value in data.items(): if not isinstance(value, dict): new_data[key] = value else: for k, v in value.items(): new_data[key + "_" + k] = v return new_data def main(): # Read the JSON file as python dictionary data = read_json(filename="article.json") # Normalize the nested python dict new_data = normalize_json(data=data) print("New dict:", new_data, "\n") # Create a pandas dataframe dataframe = pandas.DataFrame(new_data, index=[0]) # Write to a CSV file dataframe.to_csv("article.csv") if __name__ == '__main__': main()
Ausgabe:
Die beiden obigen Beispiele sind gut, wenn wir eine einzige Verschachtelungsebene für JSON haben, aber wenn die Verschachtelung zunimmt und mehr Datensätze vorhanden sind, erfordern die obigen Codes mehr Bearbeitung. Wir können solche JSON-Dateien mit der Pandas-Bibliothek sehr einfach handhaben. Lassen Sie uns sehen, wie.
Konvertieren Sie N-verschachteltes JSON in CSV
Eine beliebige Anzahl von Verschachtelungen und Datensätzen in einem JSON kann mit minimalem Code mithilfe der Methode „ json_normalize() “ in Pandas verarbeitet werden .
Syntax:
json_normalize(daten)
Verwendete Datei : details.json-Datei
{ "details": [ { "id": "STU001", "name": "Amit Pathak", "age": 24, "results": { "school": 85, "high_school": 75, "graduation": 70 }, "education": { "graduation": { "major": "Computers", "minor": "Sociology" } } }, { "id": "STU002", "name": "Yash Kotian", "age": 32, "results": { "school": 80, "high_school": 58, "graduation": 49 }, "education": { "graduation": { "major": "Biology", "minor": "Chemistry" } } }, { "id": "STU003", "name": "Aanchal Singh", "age": 28, "results": { "school": 90, "high_school": 70, "graduation":65 }, "education": { "graduation": { "major": "Art", "minor": "IT" } } }, { "id": "STU004", "name": "Juhi Vadia", "age": 23, "results": { "school": 95, "high_school": 89, "graduation": 83 }, "education": { "graduation": { "major": "IT", "minor": "Social" } } } ] }
Hier besteht der Schlüssel „ Details “ aus einem Array von 4 Elementen, wobei jedes Element 3 Ebenen verschachtelter JSON- Objekte enthält. Die „ Dur “- und „ Moll “-Tonart in jedem dieser Objekte befindet sich in einer Ebene-3-Verschachtelung.
Sich nähern
- Der erste Schritt besteht darin, die JSON-Datei als Python-Dict-Objekt zu lesen. Dies wird uns helfen, Python-Dict-Methoden zu verwenden, um einige Operationen auszuführen. Für die Aufgabe wird die Funktion read_json() verwendet, die den Dateipfad zusammen mit der Erweiterung als Parameter verwendet und den Inhalt der JSON-Datei als Python-Dict-Objekt zurückgibt.
- Wir haben für jedes im Details-Array vorhandene JSON-Objekt iteriert. In jeder Iteration haben wir zuerst den JSON normalisiert und einen temporären Datenrahmen erstellt. Dieser Datenrahmen wurde dann an den Ausgabedatenrahmen angehängt.
- Anschließend wurde der Spaltenname zur besseren Sichtbarkeit umbenannt. Wenn wir die Konsolenausgabe sehen, wurde die Spalte „ major “ vor der Umbenennung als „ education.graduation.major “ benannt. Dies liegt daran, dass die Methode „ json_normalize() “ die Schlüssel in der vollständigen Verschachtelung zum Generieren des Spaltennamens verwendet, um Probleme mit doppelten Spalten zu vermeiden. „ Bildung “ ist also die erste Ebene, „ Abschluss “ die zweite und „ Hauptfach “ die dritte Ebene in der JSON-Verschachtelung. Daher wurde die Spalte „ Bildung.Abschluss.Major “ einfach in „Abschluss“ umbenannt.
- Nach dem Umbenennen der Spalten speichert die Methode to_csv() das Pandas-Datenrahmenobjekt als CSV am angegebenen Dateispeicherort.
Beispiel: Konvertieren von n-verschachteltem JSON in CSV
Python
import json import pandas def read_json(filename: str) -> dict: try: with open(filename, "r") as f: data = json.loads(f.read()) except: raise Exception(f"Reading {filename} file encountered an error") return data def create_dataframe(data: list) -> pandas.DataFrame: # Declare an empty dataframe to append records dataframe = pandas.DataFrame() # Looping through each record for d in data: # Normalize the column levels record = pandas.json_normalize(d) # Append it to the dataframe dataframe = dataframe.append(record, ignore_index=True) return dataframe def main(): # Read the JSON file as python dictionary data = read_json(filename="details.json") # Generate the dataframe for the array items in # details key dataframe = create_dataframe(data=data['details']) # Renaming columns of the dataframe print("Normalized Columns:", dataframe.columns.to_list()) dataframe.rename(columns={ "results.school": "school", "results.high_school": "high_school", "results.graduation": "graduation", "education.graduation.major": "grad_major", "education.graduation.minor": "grad_minor" }, inplace=True) print("Renamed Columns:", dataframe.columns.to_list()) # Convert dataframe to CSV dataframe.to_csv("details.csv", index=False) if __name__ == '__main__': main()
Ausgabe:
$Konsolenausgabe
—–
Normalisierte Spalten: ['id', 'name', 'age', 'results.school', 'results.high_school', 'results.graduation', 'education.graduation.major', 'education.graduation.minor']
Umbenannte Spalten: ['id', 'name', 'age', 'school', 'high_school', 'graduation', 'grad_major', 'grad_minor']