Ga naar hoofdinhoud

Tekst naar getallen

Je leest nu de rijen van een CSV, en je zag dat alles erin tekst is. Een voorspeller rekent met afstanden, dus hij heeft getallen nodig. In deze stap maak je van elke kolom een getal: een aantal met int(), een kommagetal met float(), een maand met een dictionary.

Voorspel​

rij = ["Feb", "3", "TRUE", "FALSE"]
print(rij[1] + rij[1])
print(int(rij[1]) + int(rij[1]))
print(rij[2] == True)
print(rij[2] == "TRUE")

Wat print dit programma?

Antwoord
33
6
False
True

'3' + '3' plakt twee teksten aan elkaar. Pas na int() telt Python op. En de tekst 'TRUE' is niet de waarde True.

Zo werkt het​

Alles wat uit een CSV komt, is tekst. '3' is geen getal, en 'TRUE' is geen True. Je zet daarom elke kolom om:

  • een aantal met int(), een kommagetal zoals '2.5' met float();
  • 'TRUE' of 'FALSE' met een if naar 1 of 0;
  • een maand met een dictionary MAANDEN, die bij elke naam een getal opzoekt: januari is 0, december is 11.

Onderzoek​

  1. Draai de code. Welke twee getallen maakt hij van de rij, en wat is hun som?
  2. Een bezoek duurde "2.5" minuten. Zet "2.5" op de plek van "3". Wat doet int() ermee? Wat moet je in plaats van int() gebruiken?
  3. Zet de "2.5" terug op "3", en schrijf de maand als "feb", met een kleine letter. Wat gebeurt er?
Python
Code-omgeving wordt voorbereid…
Antwoorden
  1. 1 3, en samen 4. Februari is maand 1, want januari is 0.
  2. Python stopt met een foutmelding: int() leest alleen hele getallen. Met float(rij[1]) krijg je 2.5, en is de som 3.5.
  3. Python stopt met een foutmelding over 'feb': die sleutel staat niet in de dictionary, alleen 'Feb'. Eén letter anders, en de dictionary vindt de maand niet. Kijk daarom bij Shopping in het bestand zelf hoe de maanden geschreven zijn.

Opdracht: hoeveel pagina's samen?​

Tel op hoeveel pagina's alle bezoekers samen bekeken. Met de regels in de editor print je:

41 pagina's samen

Begin klein, en breid de code stap voor stap uit:

  1. Draai de code: hij print het aantal pagina's van elke bezoeker.
  2. Zet vóór de loop totaal = 0. Tel in de loop elk aantal als getal bij totaal op, en print totaal na de loop.
  3. Zet een # voor next(lezer), en draai de code nog eens. Wat gebeurt er?
Python
Code-omgeving wordt voorbereid…
Tip

Krijg je bij stap 2 een foutmelding over int en str? Dan tel je een getal en een tekst bij elkaar op. Welke van de twee moet je eerst omzetten?

Antwoord

Dit vervangt alles onder de lijst regels:

lezer = csv.reader(regels)
next(lezer)
totaal = 0
for rij in lezer:
totaal = totaal + int(rij[1])
print(totaal, "pagina's samen")
41 pagina's samen

Zonder next(lezer) gaat het mis bij de kopregel; zie hieronder.

Er gaat iets mis​

ValueError: invalid literal for int() with base 10: 'paginas'

Oorzaak: je hebt de kopregel niet overgeslagen. In die regel staat in de kolom van het aantal pagina's het woord paginas, en daar kan int() geen getal van maken.

Oplossing: zet next(lezer) vóór de loop.

# FOUT
lezer = csv.reader(regels)
for rij in lezer:
print(int(rij[1]))

# GOED
lezer = csv.reader(regels)
next(lezer)
for rij in lezer:
print(int(rij[1]))

Door naar kenmerken en labels.