14d Regels opsplitsen
Deze les gebruikt regels lezen met strip(), uit Een tekstbestand lezen, en uitpakken, uit Tuples.
Een regel in een bestand bevat vaak meer dan één ding: een naam en een
score, gescheiden door een puntkomma. Met split() knip je zo'n regel in
stukken:
regel = "Sara;120"
delen = regel.split(";")
print(delen)
print(delen[0])
print(int(delen[1]) + 10)
Uitvoer:
['Sara', '120']
Sara
130
split(";") knipt de tekst op elke ; en geeft een lijst met de stukken.
Die stukken zijn allemaal tekst, ook '120'. Om ermee te rekenen maak je er
eerst een getal van met int().
Een heel bestand
Zo lees je een bestand met een score op elke regel:
with open("scores.txt", "w") as bestand:
bestand.write("Sara;120\nAlex;95\nNoor;150\n")
with open("scores.txt") as bestand:
for regel in bestand:
naam, punten = regel.strip().split(";")
print(f"{naam} heeft {punten} punten")
Uitvoer:
Sara heeft 120 punten
Alex heeft 95 punten
Noor heeft 150 punten
Eerst haalt strip() de enter eraf, dan knipt split(";") de regel in twee.
Omdat er precies twee stukken uitkomen, kun je ze meteen uitpakken in naam
en punten, net als een tuple in les 12.
Een bestand met een komma tussen de stukken heet een CSV-bestand. Excel en
Google Sheets kunnen zo'n bestand openen en opslaan. Je leest het op dezelfde
manier, met split(",").
Er gaat iets mis
Rekenen met tekst
punten = ["120", "95", "150"]
print(max(punten))
Uitvoer:
95
Geen foutmelding, maar wel het verkeerde antwoord. "95" is tekst, en tekst
vergelijkt Python letter voor letter, zoals in een woordenboek. "9" komt na
"1", dus "95" is de grootste. Uit een bestand komt altijd tekst: maak er
met int() een getal van voordat je gaat vergelijken of rekenen.
Een regel zonder puntkomma
regel = "Sara 120"
naam, punten = regel.split(";")
Uitvoer:
ValueError: not enough values to unpack (expected 2, got 1)
Er staat geen ; in de regel, dus split geeft een lijst met één stuk:
['Sara 120']. Dat past niet in twee variabelen. Kijk of het teken tussen de
haakjes van split hetzelfde is als het teken in het bestand.
Opdracht 14d.1: Alle punten bij elkaar
Lees scores.txt en tel alle punten bij elkaar op.
Verwachte uitvoer:
Samen: 365 punten
with open("scores.txt", "w") as bestand:
bestand.write("Sara;120\nAlex;95\nNoor;150\n")
# Schrijf hier je codeKlik hier voor een tip.
Begin met totaal = 0. Knip in de loop elke regel op, en tel
int(punten) bij het totaal op.
Klik hier voor de oplossing.
with open("scores.txt", "w") as bestand:
bestand.write("Sara;120\nAlex;95\nNoor;150\n")
totaal = 0
with open("scores.txt") as bestand:
for regel in bestand:
naam, punten = regel.strip().split(";")
totaal += int(punten)
print(f"Samen: {totaal} punten")
Uitvoer:
Samen: 365 punten
Opdracht 14d.2: De winnaar
Zoek in scores.txt wie de meeste punten heeft.
Verwachte uitvoer:
Winnaar: Noor met 150 punten
with open("scores.txt", "w") as bestand:
bestand.write("Sara;120\nAlex;95\nNoor;150\n")
# Schrijf hier je codeKlik hier voor een tip.
Houd twee variabelen bij: beste_naam en beste_punten, met als
beginwaarde "" en 0. Is een score hoger dan beste_punten, dan vervang
je ze allebei. Vergeet int() niet, anders wint Alex.
Klik hier voor de oplossing.
with open("scores.txt", "w") as bestand:
bestand.write("Sara;120\nAlex;95\nNoor;150\n")
beste_naam = ""
beste_punten = 0
with open("scores.txt") as bestand:
for regel in bestand:
naam, punten = regel.strip().split(";")
if int(punten) > beste_punten:
beste_naam = naam
beste_punten = int(punten)
print(f"Winnaar: {beste_naam} met {beste_punten} punten")
Uitvoer:
Winnaar: Noor met 150 punten
Opdracht 14d.3: Van bestand naar dictionary (uitdaging)
Lees cijfers.txt in een dictionary, met het vak als sleutel en het cijfer
als kommagetal. Print de dictionary en het gemiddelde.
Verwachte uitvoer:
{'wiskunde': 7.5, 'engels': 6.0, 'biologie': 8.1}
Gemiddelde: 7.2
with open("cijfers.txt", "w") as bestand:
bestand.write("wiskunde,7.5\nengels,6.0\nbiologie,8.1\n")
# Schrijf hier je codeKlik hier voor een tip.
Hier staat een komma tussen de stukken. Begin met een lege dictionary
cijfers = {} en totaal = 0. Zet in de loop cijfers[vak] = float(cijfer)
en tel het cijfer bij totaal op. Het gemiddelde is totaal gedeeld door
len(cijfers), met :.1f voor één cijfer achter de punt.
Klik hier voor de oplossing.
with open("cijfers.txt", "w") as bestand:
bestand.write("wiskunde,7.5\nengels,6.0\nbiologie,8.1\n")
cijfers = {}
totaal = 0
with open("cijfers.txt") as bestand:
for regel in bestand:
vak, cijfer = regel.strip().split(",")
cijfers[vak] = float(cijfer)
totaal += float(cijfer)
print(cijfers)
gemiddelde = totaal / len(cijfers)
print(f"Gemiddelde: {gemiddelde:.1f}")
Uitvoer:
{'wiskunde': 7.5, 'engels': 6.0, 'biologie': 8.1}
Gemiddelde: 7.2