JSON und CSV · Übung
Die CSV-Struktur lesen
Eine CSV-Zeile von Hand an jedem Komma zu teilen würde das Produkt namens "Dice, Set of 6" zerlegen. Das Modul csv kennt die Regeln des Formats für Anführungszeichen bereits. Nutze dieses Wissen, statt einen Teil von CSV mit String-Methoden nachzubauen.
Die Kopfzeile benennt jede Zelle
csv.reader gibt jede Zeile als Liste zurück. csv.DictReader geht einen Schritt weiter: Es verwendet die erste Zeile als Schlüssel für jede spätere Zeile.
with open("catalog.csv", newline="", encoding="utf-8") as handle:
reader = csv.DictReader(handle, strict=True)
for row in reader:
print(row["sku"], row["name"])
Mit newline="" verarbeitet der CSV-Parser CSV-Zeilenumbrüche selbst. Die ausdrückliche Kodierung und der Kontextmanager führen den Dateivertrag aus Kapitel 5 fort. strict=True sorgt dafür, dass fehlerhafte CSV-Anführungszeichen csv.Error auslösen, statt einen beschädigten Datensatz stillschweigend zu akzeptieren.
Die zurückgegebene Zeile ist weiterhin ein Dictionary aus Text:
{
"sku": "BK-101",
"name": "Python Field Notes",
"quantity": "4",
"unit_price": "12.50",
"in_stock": "true",
}
Die Struktur vor den Werten prüfen
reader.fieldnames ist die Kopfzeile. Sie muss genau FIELDNAMES entsprechen, einschließlich der Reihenfolge. Eine umgeordnete oder zusätzliche Kopfspalte abzulehnen macht versehentliche Dateiänderungen sichtbar, statt die Bedeutung einer Spalte unbemerkt zu verändern.
Auch die Breite der Zeilen muss geprüft werden. DictReader verwendet den Schlüssel None für zusätzliche Zellen und den Wert None für fehlende Zellen. Lehne beides ab, bevor du Zeilen zurückgibst. Damit kann die nächste Lektion eine verlässliche Annahme treffen: Jedes zurückgegebene Dictionary enthält genau die fünf festgelegten Textzellen.
Jetzt bist du dran
Implementiere validate_headers(fieldnames) und read_csv_rows(path) in catalog.py.
Bei einer richtigen Kopfzeile kehrt die Funktion normal zurück; jeder andere Wert löst
ValueErrormit einer Meldung aus, die die erwartete Kopfzeile nennt.Öffne
pathnach dem oben gezeigten Dateivertrag aus Kapitel 5.Erstelle einen
csv.DictReadermitstrict=True.Prüfe seine Kopfzeile, bevor du Datenzeilen liest.
Lehne eine Zeile mit einer zusätzlichen oder fehlenden Zelle ab und nenne im Fehler ihre bei eins beginnende CSV-Zeilennummer.
Gib eine Liste der unverarbeiteten Zeilen-Dictionarys zurück. Wandle noch keine Werte um.
Hier bedeutet „Zeilennummer“ die logische CSV-Datensatznummer: Die Kopfzeile ist Zeile 1, der erste Datensatz Zeile 2. Eine Zelle in Anführungszeichen kann einen Zeilenumbruch enthalten, ohne dadurch zu einem zweiten Datensatz zu werden.
Du musst das Beispiel nicht Zeile für Zeile übernehmen. Wichtig ist, dass eine richtige Kopfzeile Zeilen liefert, eine umgeordnete Kopfzeile eine Ausnahme auslöst und eine Zeile mit falscher Zellenanzahl eine Ausnahme mit ihrer Zeilennummer auslöst. Probiere jeden Fall in einer vorübergehenden Kopie von catalog.csv aus und übergib deren Pfad an read_csv_rows. Behalte die ursprüngliche dreizeilige catalog.csv für die Einreichung unverändert bei.
DictReader gibt einer Zeile den Schlüssel None oder den Wert None. Was ist passiert?
Aufgabe
Implementiere validate_headers(fieldnames) und read_csv_rows(path).
Gib jedes unverarbeitete Zeilen-Dictionary aus catalog.csv zurück und bewahre dabei das Komma in Dice, Set of 6. Lehne eine falsche Kopfzeile und jede Zeile mit zu vielen oder zu wenigen Zellen ab. Lass jede Zelle für die nächste Lektion als Text stehen.