Von CSV zu JSON Datei

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fischer-klaus3
User
Beiträge: 27
Registriert: Donnerstag 17. September 2020, 08:07

Hallo zusammen,

ich würde gerne eine CSV Datei zu einer JSON Datei umwandeln. Dies habe ich auch bereits geschafft mit:

Code: Alles auswählen

import csv 
import json 
 
csvFilePath = ""
jsonFilePath = ""
  
def make_json(csvFilePath, jsonFilePath): 
      
    data = {} 
      
    with open(csvFilePath, encoding='utf-8') as csvf: 
        csvReader = csv.DictReader(csvf) 
          
        for rows in csvReader: 
              
            key = rows['No'] 
            data[key] = rows 
  
    with open(jsonFilePath, 'w', encoding='utf-8') as jsonf: 
        jsonf.write(json.dumps(data, indent=4)) 
          


csvFilePath = r'Names.csv'
jsonFilePath = r'Names.json'
  
make_json(csvFilePath, jsonFilePath)
Bild

Ein User erhält für jede neue Session eine eindeutige SessionID. Ich würde gerne eine SessionID einsammeln und dann schauen, was der User in dieser Session alles gemacht hat.
Die finale Json sollte ungefähr so aussehen:

Code: Alles auswählen

{
    "info": {
        "generated_on": "2017-12-03 08:41:42.057563", 
        "slice": "0-999", 
        "version": "v1"
    }, 
    "session": [
        {
            "user_session": "asahudjsad4ads5", 
            "user_id": "1544454", 
            "total_price": 5.45, 
            "num_items": 12, 
            "items": [
                {
                    "pos": 0, 
                    "product_id": "455151", 
                    "event_type": "transaciton", 
                    "event_time": "2017-12-03 08:41:42.057563", 
                    "brand": "grattol", 
                    "price": 5.45, 
                    "category_id": 226863, 
                    "category_code": "NaN"
                }, 
                 {
                    "pos": 0, 
                    "product_id": "48412", 
                    "event_type": "view", 
                    "event_time": "2017-12-03 08:41:42.057563", 
                    "brand": "grattol", 
                    "price": 7.45, 
                    "category_id": 226863, 
                    "category_code": "NaN"
                }, 
				.
				.
				.
            ]
        }, 
		.
		.
		.
}
Die SessionIDs sind zusammengefasst und unter Items werden die verschiedene Artikel aufgelistet mit den Namen.
Wie kann ich von der csv -> zu meiner Wunsch Json Datei gelangen? Zudem wurde noch die totale Summe von nur den gekauften Artikeln zusammen gerechnet und die komplette Anzahl der Artikel gezählt.
Also wenn Event == transaction, dann rechne den Preis zusammen; Berechne die Anzahl alle Artikel.

Es würde mich sehr freuen, wenn ihr mir weiter helfen könntet. Ich bedanke mich sehr im Voraus und wünsche noch einen tollen und erfolgreichen Tag! :)
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

Die willst nach user_session Gruppieren. Dafür nimmt man ein Wörterbuch.
Oder, falls es etwas externes sein darf: pandas.
fischer-klaus3
User
Beiträge: 27
Registriert: Donnerstag 17. September 2020, 08:07

@Sirius3 danke für deine Antwort :) . user_session ist ein Hash-Wert, wie kann ich diesen dann mit pandas gruppieren lassen und dann in die Json form bringen?
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

Arbeit am besten das Pandas-Tutorial durch.
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fischer-klaus3: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Namen solltenn auch nicht kryptisch abgekürzt werden wie `csvf` oder `jsonf`.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Vertipp Dich mal bei einem der Variablennamen die sowohl auf Modulebene als auch lokal irgendwo verwendet werden und habe dann sehr viel Spass bei der Fehlersuche.

Beim öffnen der CSV-Datei fehlt das `newline`-Argument.

Der Name `rows` ist inhaltlich falsch denn das ist nur *ein* Datensatz, nicht mehrere.

Das einlesen in ein Wörterbuch ist ziemlich ”langatmig” geschrieben. Das ist letztendlich eine „dict comprehension“.

Das schreiben vom JSON ist ein ein Tick zu umständlich: statt `write()` und `json.dumps()` würde man hier `json.dump()` verwenden.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import csv
import json


def make_json(csv_file_path, json_file_path):
    with open(csv_file_path, encoding="utf-8", newline="") as csv_file:
        data = {row["No"]: row for row in csv.DictReader(csv_file)}

    with open(json_file_path, "w", encoding="utf-8") as json_file:
        json.dump(data, json_file, indent=4)


def main():
    csv_file_path = "Names.csv"
    json_file_path = "Names.json"
    make_json(csv_file_path, json_file_path)


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
fischer-klaus3
User
Beiträge: 27
Registriert: Donnerstag 17. September 2020, 08:07

@__blackjack__ danke für die vielen Hinweise und den Code! Ich danke dir sehr und wünsche noch einen tollen Tag.
PS: werde mir die Hinweise zum Herzen nehmen, damit ich ein besserer Programmierer werde... :)
Antworten