Python Lernhandbuch

Kapitel 11: CSV, JSON und Excel lesen und bearbeiten

Musterlösung mit Erklärung

Deine Lösung hat die Prüfung noch nicht bestanden. Lies die Erklärung, dann versuche es erneut – möglichst ohne abzuschreiben.
Aufgabe noch einmal lesen

Mit der Datei verkaeufe.csv von oben:

  1. Lies die Datei ein und berechne pro Zeile den Umsatz (menge * preis).
  2. Berechne den Gesamtumsatz pro Kunden.
  3. Schreibe eine Excel-Datei auswertung.xlsx mit zwei Blättern: Details (alle Zeilen mit Umsatz) und Pro Kunde (Kunde, Umsatz, absteigend sortiert).
  4. Formatiere die Kopfzeilen fett, die Umsatzspalten mit zwei Nachkommastellen, und setze eine Summenzeile als Formel.
python
import csv
from openpyxl import Workbook
from openpyxl.styles import Font

# 1: einlesen
with open('verkaeufe.csv', newline='', encoding='utf-8-sig') as f:
    zeilen = list(csv.DictReader(f, delimiter=';'))

for z in zeilen:
    z['menge'] = int(z['menge'])
    z['preis'] = float(z['preis'])
    z['umsatz'] = z['menge'] * z['preis']

# 2: pro Kunde summieren
pro_kunde = {}
for z in zeilen:
    pro_kunde[z['kunde']] = pro_kunde.get(z['kunde'], 0) + z['umsatz']

# 3: Excel schreiben
wb = Workbook()

ws1 = wb.active
ws1.title = 'Details'
ws1.append(['Kunde', 'Artikel', 'Menge', 'Preis', 'Umsatz'])
for z in zeilen:
    ws1.append([z['kunde'], z['artikel'], z['menge'], z['preis'], z['umsatz']])
letzte = ws1.max_row
ws1.append(['', '', '', 'Summe', f'=SUM(E2:E{letzte})'])

ws2 = wb.create_sheet('Pro Kunde')
ws2.append(['Kunde', 'Umsatz'])
for kunde, summe in sorted(pro_kunde.items(), key=lambda p: p[1], reverse=True):
    ws2.append([kunde, summe])

# 4: formatieren
for ws in (ws1, ws2):
    for zelle in ws[1]:
        zelle.font = Font(bold=True)
    ws.column_dimensions['A'].width = 16
for zeile in ws1.iter_rows(min_row=2, min_col=4, max_col=5):
    for zelle in zeile:
        zelle.number_format = '0.00'
for zeile in ws2.iter_rows(min_row=2, min_col=2, max_col=2):
    zeile[0].number_format = '0.00'

wb.save('auswertung.xlsx')

Was passiert:

  • Alle CSV-Werte sind zuerst Strings. Die erste Schleife wandelt sie in Zahlen um und ergänzt eine neue Spalte umsatz direkt im Dictionary.
  • Die Gruppierung pro Kunde folgt dem Zählermuster aus Kapitel 4: get(schluessel, 0) + wert.
  • Workbook() legt eine Datei mit einem leeren Blatt an, das active heißt und hier in Details umbenannt wird. create_sheet('Pro Kunde') fügt ein weiteres hinzu.
  • ws1.max_row wird gelesen, bevor die Summenzeile angehängt wird, damit die Formel genau über die Datenzeilen läuft (E2:E5).
  • Die Schleife for ws in (ws1, ws2) wendet dieselbe Formatierung auf beide Blätter an, statt sie zu kopieren.

Warum so: Daten zuerst sauber in Python-Strukturen bringen, dann in ein Ausgabeformat schreiben. So kannst du dieselben Daten später auch in eine Datenbank oder Webseite geben, ohne die Berechnung zu ändern.