Ein Schema erstellen, Daten importieren und das Schema weiterentwickeln · Übung
Die Struktur der CSV-Datei prüfen
Bevor ein Import IDs oder Leihdauern beurteilen kann, muss er wissen, ob er überhaupt die zugesagte Tabelle erhalten hat. Öffne catalog_import.py und vervollständige read_item_rows(csv_path). Diese Funktion liest nur Text. Sie öffnet, erstellt oder bereitet keine Datenbank vor.
Run ruft auf:
read_item_rows(Path("data/items.csv"))
Die sichtbare data/items.csv hat die exakte geordnete Kopfzeile id,asset_tag,name,category,loan_days und drei Zeilen. Ein erfolgreicher Aufruf gibt unverarbeitete Dictionaries zurück, also sind Werte wie "1" und "7" weiterhin Strings:
== check the CSV shape ==
Call: read_item_rows(Path("data/items.csv"))
Rows read: 3
First row: {'id': '1', 'asset_tag': 'TL-100', 'name': 'Cordless drill', 'category': 'tools', 'loan_days': '7'}
Four-cell row -> Error: CSV row 2 must contain exactly five cells.
Verwende Path(csv_path).open("r", encoding="utf-8", newline="") und csv.DictReader(..., strict=True). Vergleiche reader.fieldnames direkt mit ITEM_HEADERS; ein Mengenvergleich würde umgeordnete oder wiederholte Überschriften fälschlich akzeptieren. Beginne einen Zähler row_number bei 1 und erhöhe ihn für jede Datenzeile einmal. Lehne sowohl fehlende als auch zusätzliche Zellen ab. DictReader stellt diese Fälle unterschiedlich dar, also prüfe jeden Wert und den besonderen Schlüssel None.
Vereinheitliche jeden Eingabefehler zur exakten ValueError-Meldung unten:
| Problem | Meldung |
|---|---|
| Fehlender Pfad | CSV file does not exist. |
| Nicht dekodierbare Bytes | CSV must be UTF-8 text. |
| Fehlerhaftes CSV | CSV is not valid. |
| Falsche oder umgeordnete Überschriften | CSV headers must be exactly: id,asset_tag,name,category,loan_days. |
| Keine Gegenstandszeilen | CSV must contain at least one item row. |
| Falsche Zellenanzahl in Datensatz N | CSV row N must contain exactly five cells. |
Gib erst zurück, nachdem die ganze Datei gelesen wurde. Das liefert der Validierung einen vollständigen Datenstapel im Arbeitsspeicher, bevor eine Datenbank verändert werden kann. An dieser Grenze ist eine leere Textzelle strukturell gültig. Die Validierung entscheidet, ob ihre Bedeutung akzeptabel ist.
Die Zeilennummer im Fehler zählt CSV-Datensätze, wobei die Kopfzeile als Zeile 1 gilt. Sie ist nicht immer eine physische Zeilennummer: Ein Feld in Anführungszeichen kann mehrere Zeilen umfassen, und DictReader überspringt Leerzeilen. Verwende die Datensatznummer, um den Gegenstand in einer CSV-Ansicht zu finden, statt anzunehmen, sie benenne eine einzelne Zeile im Texteditor. Behalte Kommas innerhalb zitierter Felder und Unicode-Text genau so bei, wie DictReader sie zurückgibt. Entferne hier keine Rand-Leerzeichen und wandle nichts um. Das sind Bedeutungsprüfungen, die in die nächste Funktion gehören.
Aufgabe
Vervollständige read_item_rows(csv_path) in catalog_import.py.
Verlange UTF-8-Text, die exakten geordneten ITEM_HEADERS, mindestens eine Gegenstandszeile und genau fünf Zellen pro Zeile. Gib unverarbeitete Dictionaries zurück. Verwende die oben gezeigten exakten vereinheitlichten Meldungen, einschließlich CSV file does not exist., und berühre keine Datenbank.