Maak een schema, importeer gegevens en ontwikkel het verder · oefening
Controleer de structuur van de CSV
Voordat een import ID’s of uitleentermijnen kan beoordelen, moet die weten of de beloofde tabel überhaupt is ontvangen. Open catalog_import.py en maak read_item_rows(csv_path) af. Deze functie leest alleen tekst. Ze opent geen database, maakt er geen aan en bereidt er geen voor.
Run doet deze aanroep:
read_item_rows(Path("data/items.csv"))
Het zichtbare data/items.csv heeft de exacte kolomkoppen id,asset_tag,name,category,loan_days in die volgorde en drie rijen. Een geslaagde aanroep geeft onbewerkte dictionaries terug, dus zijn waarden zoals "1" en "7" nog steeds 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.
Gebruik Path(csv_path).open("r", encoding="utf-8", newline="") en csv.DictReader(..., strict=True). Vergelijk reader.fieldnames rechtstreeks met ITEM_HEADERS; een vergelijking als sets zou gewijzigde volgordes of herhaalde kolomkoppen ten onrechte accepteren. Begin een teller row_number op 1 en verhoog die één keer per gegevensrij. Weiger zowel ontbrekende als extra cellen. DictReader geeft die gevallen verschillend weer, dus controleer elke waarde en de speciale sleutel None.
Zet elke invoerfout om naar de exacte ValueError-melding hieronder:
| Probleem | Melding |
|---|---|
| Ontbrekend pad | CSV file does not exist. |
| Bytes die niet kunnen worden gedecodeerd | CSV must be UTF-8 text. |
| Ongeldige CSV-opmaak | CSV is not valid. |
| Verkeerde kolomkoppen of kolomvolgorde | CSV headers must be exactly: id,asset_tag,name,category,loan_days. |
| Geen voorwerprijen | CSV must contain at least one item row. |
| Verkeerd aantal cellen in record N | CSV row N must contain exactly five cells. |
Geef pas een resultaat terug nadat je het volledige bestand hebt gelezen. Zo krijgt de validator een volledige batch in het geheugen voordat een database kan veranderen. Op dit punt is een lege tekstcel structureel geldig. De validator bepaalt of de betekenis ervan aanvaardbaar is.
Het rijnummer in de foutmelding telt CSV-records, met de kopregel als rij 1. Het is niet altijd een fysiek regelnummer: een veld tussen aanhalingstekens kan meerdere regels beslaan en DictReader slaat lege regels over. Gebruik het recordnummer om het voorwerp in een CSV-weergave te vinden, in plaats van aan te nemen dat het één regel in een teksteditor aanwijst. Behoud komma’s in velden tussen aanhalingstekens en Unicode-tekst precies zoals DictReader ze teruggeeft. Verwijder hier geen omringende witruimte en zet geen waarden om; dat zijn inhoudelijke controles die in de volgende functie horen.
Opdracht
Maak read_item_rows(csv_path) in catalog_import.py af.
Vereis UTF-8-tekst, exact ITEM_HEADERS in de juiste volgorde, minstens één voorwerprij en precies vijf cellen per rij. Geef onbewerkte dictionaries terug. Gebruik de exacte gestandaardiseerde meldingen hierboven, inclusief CSV file does not exist., en raak geen database aan.