ID.nl logo
Zo kun je programmeren in Python - Deel 5
© Reshift Digital
Zekerheid & gemak

Zo kun je programmeren in Python - Deel 5

In de href="https://computertotaal.nl/artikelen/pc/zo-kun-je-programmeren-in-python-deel-4/" rel="noopener noreferrer" target="_blank">vorige les</a> toonden we allerlei manieren om de uitvoer van tekst op het scherm aan te passen. In deze les zetten we de stap van je scherm naar bestanden: we gaan gegevens uit bestanden lezen en naar bestanden schrijven. Daarnaast leer je reageren op exceptions: foutmeldingen die Python je geeft als er iets misgaat.

Twee lessen geleden gebruikte je de functie input om wat de gebruiker op zijn toetsenbord intypt te registreren. En in de vorige les toonden we je hoe je met de functie print uitvoer op het scherm toont. Maar in- en uitvoer kan ook via bestanden verlopen. Laten we eens kijken hoe dat gaat.

Hier kun je les vier bekijken.

We beperken ons in deze les tot het lezen en schrijven van tekstbestanden. Je kunt ook met binaire bestanden werken, die willekeurige data in een andere vorm dan tekst kunnen bevatten, maar dat is wat meer werk omdat je de data nog moet interpreteren. Voor de rest werkt dit hetzelfde.

Een tekstbestand lezen

We tonen hier in een voorbeeld hoe je op een Linux-machine zoals een Raspberry Pi met Raspberry Pi OS (tot voor kort Raspbian geheten) het bestand met de lijst van gebruikers uitleest. Ook op macOS werkt dit voorbeeld. Gebruik je Windows, maak dan zelf een bestand aan met de inhoud die we in ons voorbeeld tonen en pas de locatie van het te openen bestand aan in je Python-code.

De eenvoudigste manier om een volledig tekstbestand uit te lezen en op het scherm te tonen, heeft maar twee regels nodig:

with open('/etc/passwd', 'rt') as bestand:

print(bestand.read())

In de eerste regel openen we het bestand met de functie open. Het eerste argument is het bestand dat we willen openen. We hebben hier een volledig pad gebruikt: '/etc/passwd'. Als je een bestand wilt lezen dat in dezelfde directory staat als waarin je de Python-interpreter hebt opgestart, hoef je geen volledig pad door te geven: de bestandsnaam volstaat dan. Met het tweede argument 'rt' geven we aan dat we het bestand willen lezen en dat het om een tekstbestand gaat.

De constructie met with is wat Python een ‘context manager’ noemt. In het with-blok heb je toegang tot het object bestand dat het geopende bestand voorstelt. Na het with-blok wordt het bestand automatisch gesloten, zodat je het niet meer kunt lezen. Dit lijkt vanzelfsprekend, maar dat is het niet: ook zonder with kun je bestanden openen, maar als je dan het bestand na gebruik vergeet te sluiten, kan dit tot problemen leiden. Werk dus nooit met bestanden zonder with.

In de tweede regel roepen we de functie read op het object bestand aan. Deze functie geeft de volledige inhoud van het tekstbestand terug als een string, die we dan met print op het scherm tonen. Op een typisch Linux-systeem ziet de uitvoer er als volgt uit (we tonen hier maar enkele regels):

root:x:0:0:root:/root:/bin/bash

daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

bin:x:2:2:bin:/bin:/usr/sbin/nologin

Enzovoort

Een tekstbestand regel voor regel lezen

Maar wat als we niet het hele bestand in één keer willen inlezen, maar regel voor regel, bijvoorbeeld omdat we willen testen of de regels aan specifieke voorwaarden voldoen? Geen probleem, ook dat is in Python heel eenvoudig. In plaats van de functie read op je bestand toe te passen, ga je dan met een for-lus door de elementen van het bestand. Het tekstbestand dat je van de functie open terugkrijgt, gedraagt zich immers als een lijst met als elementen de opeenvolgende regels in het bestand.

Een string splitsen

Maar als we die regels een voor een gaan inlezen, moeten we er ook iets mee doen. Zoals je ziet, bevat het bestand /etc/passwd op elke regel allerlei informatie over de gebruiker, telkens afgescheiden door een dubbele punt. We willen elk van die gegevens afzonderlijk uitlezen. Dat gaat eenvoudig met de functie split die we op een string kunnen uitvoeren. Bijvoorbeeld:

>>> 'root:x:0:0:root:/root:/bin/bash'.split(':')

['root', 'x', '0', '0', 'root', '/root', '/bin/bash']

Je ziet hier dat we aan de functie split het teken meegeven dat de verschillende componenten van de string afscheidt: ':'. Het resultaat is een lijst met strings die onderdeel uitmaken van onze lange string, zonder de afscheidingstekens ':'.

De opeenvolgende componenten in de regels van het bestand /etc/passwd hebben overigens de volgende betekenis: gebruikersnaam, ongebruikt, ID van de gebruiker, ID van de groep, volledige gebruikersnaam, persoonlijke map van de gebruiker, shell van de gebruiker.

Een lijst uitpakken

Je kunt nu naar de elementen in de gesplitste string verwijzen met een index, bijvoorbeeld:

>>> informatie = 'root:x:0:0:root:/root:/bin/bash'.split(':')

>>> informatie[0]

'root'

>>> informatie[6]

'/bin/bash'

Maar dat is niet heel duidelijk. Zo willen we informatie[0] eigenlijk gebruiker noemen en informatie[6] de naam shell geven. Gelukkig kun je in Python de elementen van een lijst eenvoudig in één keer aan enkele variabelen toekennen. Dat heet unpacking. In ons voorbeeld gaat dat als volgt:

>>> gebruiker, *_, naam, directory, shell = 'root:x:0:0:root:/root:/bin/bash'.split(':')

>>> gebruiker

'root'

>>> _

['x', '0', '0']

>>> naam

'root'

>>> directory

'/root'

>>> shell

'/bin/bash'

De notatie * gebruik je om een willekeurig aantal elementen uit te pakken. Omdat we in dit geval niet in deze elementen geïnteresseerd zijn, kennen we ze toe aan de variabele met de naam _, vandaar dat we bij het uitpakken *_ gebruiken. We konden dit hier ook vervangen door gebruiker, _, _, _, naam, directory, shell.

Gegevens uit een tekstbestand filteren

Dan weet je nu genoeg om de volgende opdracht uit te voeren: lees het bestand met wachtwoorden regel per regel in en als de shell geen '/usr/sbin/nologin' of '/bin/false' is, toon je de gebruikersnaam, volledige gebruikersnaam en persoonlijke map.

De code ziet er als volgt uit:

with open('/etc/passwd', 'rt') as bestand:

for regel in bestand:

gebruiker, *_, naam, directory, shell = regel.strip().split(':')

if shell not in ['/bin/false', '/usr/sbin/nologin']:

print(' {1} ({0}): {2} ({3})'.format(gebruiker, naam, directory, shell))

We openen dus het bestand /etc/passwd als tekstbestand om te lezen. Voor elke regel in het bestand pakken we de verschillende elementen uit in enkele variabelen. We kijken dan of de shell niet gelijk is aan de twee eerdergenoemde shells. Als aan die voorwaarde is voldaan, tonen we de gebruiker, zijn volledige naam, zijn persoonlijke map en zijn shell.

Er is slechts één nieuwigheid in deze code: de functie strip. Die verwijdert witruimte en nieuwe regels aan het begin en het einde van een string. Dat hebben we hier nodig omdat de shell op het einde van de regel staat en er daar dus een teken voor een nieuwe regel komt. Zonder die aanroep van strip zou de vergelijking in de regel erna niet werken.

Naar een tekstbestand schrijven

Naar een tekstbestand schrijven, verloopt op een vergelijkbare manier als een tekstbestand lezen. We beginnen een with-blok waarin we het bestand openen en daarin schrijven we naar het bestand:

with open('bestand.txt', 'wt') as bestand:

bestand.write('Dit is de eerste regel.\n')

bestand.write('Dit is de tweede regel.\n')

bestand.write('Dit is de derde regel.\n')

Op het einde van elke regel moet je zelf een teken voor een nieuwe regel toevoegen: \n. Een andere manier om een regel naar een tekstbestand te schrijven, is met de functie print, die automatisch een nieuwe regel toevoegt:

print('Dit is de eerste regel.', file=bestand)

Merk op dat we het bestand openen met als tweede argument 'wt', waarmee we aangeven dat we naar het bestand willen schrijven. Op deze manier overschrijven we alle al bestaande inhoud van het bestand, dus let hiermee op!

Als je deze situatie wilt vermijden, kun je open aanroepen met de bestandsmodus 'xt'. Als het bestand nog niet bestaat, doet die hetzelfde als 'wt': je kunt naar het bestand schrijven. Maar als het bestand al bestaat, krijg je een foutmelding:

with open('bestand.txt', 'xt') as bestand:

print('Dit is een test.', file=bestand)

with open('bestand.txt', 'xt') as bestand:

print('Dit is nog een test.', file=bestand)

Traceback (most recent call last):

File "<pyshell>", line 1, in <module>

FileExistsError: [Errno 17] File exists: 'bestand.txt'

Een andere interessante bestandsmodus is 'at' (van ‘append’): hiermee voeg je aan het einde van een bestaand tekstbestand regels toe.

Exceptions afhandelen

In het voorbeeld hierboven zou je waarschijnlijk de foutmelding dat het bestand al bestaat op een nettere manier willen afhandelen. Wat we tot nu toe een foutmelding genoemd hebben, heet in Python een exception. Er bestaan verschillende types exceptions en in je Python-code kun je eenvoudig het optreden van exceptions afvangen. Dat gaat als volgt:

try:

with open('bestand.txt', 'xt') as bestand:

print('Dit is nog een test.', file=bestand)

except FileExistsError:

print('FOUT: Het bestand bestaat al.')

De code binnen het try-blok wordt uitgevoerd zoals normaal. Maar als er binnen dit blok een exception voorkomt, gaat het programma door naar het except-blok. Daarin hebben we aangegeven dat we alleen in de exceptions van het type FileExistsError geïnteresseerd zijn. In het geval er zo een voorkomt, tonen we onze eigen foutmelding. Daarna gaat het programma verder na het except-blok.

Als je meerdere types exceptions wilt afvangen, voeg je meerdere except-blokken toe met elk het andere type exception. Als je voor meerdere types exceptions dezelfde code wilt uitvoeren, dan zet je die exceptions tussen haakjes, zoals hier:

except (ZeroDivisionError, ValueError):

En als je op alle mogelijke exceptions hetzelfde wilt reageren, voeg je gewoon een except-blok zonder de naam van een exception toe, al is dat niet zo vaak zinvol.

Samenvatting

In deze les hebben we geleerd hoe we tekstbestanden kunnen inlezen en strings in onderdelen kunnen splitsen. Ook in de andere richting kun je nu met tekstbestanden werken: je kunt willekeurige tekst naar een bestand schrijven. En doordat je hebt geleerd hoe je exceptions kunt afvangen, hoeven de gebruikers van je programma geen cryptische foutmeldingen van Python meer te krijgen. Omdat je met deze kennis al complexere Python-programma’s kunt schrijven, leer je in de volgende les hoe je je programma meer kunt structureren in functies en modules.

Opdracht

Vraag de gebruiker om een regel zoals root:x:0:0:root:/root:/bin/bash voor gebruik in een wachtwoordbestand op te geven. Schrijf de belangrijkste elementen van de regel naar een afzonderlijke regel in een bestand, in de vorm: Gebruiker: root Naam: root Directory: /root Shell: /bin/bash Zorg dat je programma een heldere foutmelding geeft als de regel niet de correcte vorm voor een wachtwoordbestand heeft.

Uitwerking

regel = input('Voer een regel voor het wachtwoordbestand in: ') try: gebruiker, _, _, _, naam, directory, shell = regel.strip().split(':') with open('wachtwoordbestand', 'wt') as bestand: print('Gebruiker: {}'.format(gebruiker), file=bestand) print('Naam: {}'.format(naam), file=bestand) print('Directory: {}'.format(directory), file=bestand) print('Shell: {}'.format(shell), file=bestand) except ValueError: print('Voer de regel in de volgende vorm in:') print('gebruiker:x:0:0:naam:directory:shell') Dit is een rechtstreekse combinatie van alles wat je in deze les geleerd hebt. Let op: we hebben hier wel gebruiker, _, _, _, naam, directory, shell nodig en niet de kortere versie gebruiker, *_, naam, directory, shell. Met die laatste regel garanderen we immers niet dat de regel uit exact zeven elementen bestaat.

Cheatsheet

exception: een foutmelding in Python pad: de locatie van een bestand, met alle bovenliggende directorynamen erbij

▼ Volgende artikel
Review Dyson V8 Cyclone – Betrouwbaar basismodel doet wat-ie moet doen
© Wesley Akkerman
Huis

Review Dyson V8 Cyclone – Betrouwbaar basismodel doet wat-ie moet doen

Met een prijskaartje van 399 euro is de Dyson V8 Cyclone een van de meest betaalbare draadloze steelstofzuigers van het Britse merk. Je haalt hiervoor een redelijk compacte maar krachtige huishoudhulp in huis, die een aantal duidelijke kanttekeningen heeft.

Goed
Conclusie

De Dyson V8 Cyclone is een geslaagde steelstofzuiger voor wie krachtige prestaties zoekt zonder overbodige luxe. Vooral op tapijt en bekleding komt hij sterk naar voren, en ook het verwijderen van haren gaat hem goed af. Het harde, smalle handvat en de wat stugge vloermond voelen niet altijd even prettig aan, maar dat past deels bij de prijsklasse. Jammer is ook het ontbreken van een lcd-display met handige informatie, al is dat net als het gebrek aan een automatische zuigstand goed te overzien. Alles bij elkaar is dit een betrouwbaar basismodel dat doet wat hij moet doen.

Plus- en minpunten
  • Krachtig zuigsysteem
  • Lekker wendbaar
  • Prima batterijduur
  • Handig opvang- en leegsysteem
  • Twee knoppen voor de bediening
  • Verrassend compleet
  • Voelt soms wat basaal
  • Handvat is niet comfortabel
  • Nieuwe vloermond tikt hard op de grond
  • Geen lcd-display
  • Zelf van zuigstand wisselen

De Dyson V8 heeft een nieuw ontwerp gekregen. Weg is de trekker die je constant moet indrukken om het apparaat te laten zuigen. In plaats daarvan beschikt hij voortaan over een handige aan-uitknop. Daarnaast zit een moduswisselaar, die met verschillende kleuren aangeeft welke zuigstand je gebruikt. Opvallend is ook dat Dyson voor de V8 Cyclone geen spannende kleuren voor de plastic onderdelen gebruikt. In plaats daarvan zien we een combinatie van kaki, rood, grijs en zwart; het geheel valt daardoor minder op.

©Wesley Akkerman

De nieuwe Dyson V8 Cyclone

De nieuwe V8 levert 30 procent meer zuigkracht en een 50 procent langere accuduur. In de laagste zuigstand houdt hij het tot 60 minuten vol. Helaas ontbreekt een handig lcd-scherm (dat wel op duurdere modellen zit) voor de resterende accutijd; ook hier moet je het doen met iets te simpele led-indicators. Onderop zit een nieuwe vloerzuigmond, die Dyson de 'Motorbar' noemt. Die moet dankzij het gebruik van speciale kammetjes effectief zijn tegen vastzittende haren, maar de stofzuiger moet het verder ook zonder moderne functies doen zoals lasers of stofsensoren.

Met slechts 2,7 kilogram is de Dyson V8 Cyclone lekker licht en wendbaar, waardoor je moeiteloos vloeren en zelfs hoekjes op het plafond schoonhoudt. Het stofreservoir (540 milliliter) heeft een handig uitwerpsysteem waarbij je het vuil niet hoeft aan te raken. Toch zijn we niet helemaal tevreden over alle eigenschappen van de zuigmodule. Het handvat is namelijk smal en klein, waardoor je grip bij langer gebruik oncomfortabel is. Ook kan het bij je duim gaan schuren. Dit is waarschijnlijk de minst ergonomische Dyson die we op de redactie hebben getest.

©Wesley Akkerman

Dyson V8 Cyclone in de praktijk

Gelukkig biedt de Dyson V8 Cyclone met 297 air-watts in de Boost-stand een flinke verbetering in zuigkracht (ten opzichte van zijn voorganger). De standaardmodus levert 79 aW en dat is voor ons ruim voldoende voor dagelijkse taken. Vooral het vloerkleed moet eraan geloven: haren, kruimels en ander vuil worden daar moeiteloos uit gezogen. Op hardere vloeren stelt de Cyclone eveneens niet teleur, al valt er wel één ding op. Wanneer je de stofzuiger oppakt nadat je bijvoorbeeld wat kruimels of korrels opzuigt, kan het zijn dat er een paar uit de mond vallen.

Daarnaast missen we een zachte(re) borstel op de Dyson V8 Cyclone. De huidige zuigmond ratelt namelijk hard over de vloer, wat niet zo prettig is voor (onder)buren in een flat- of appartementsgebouw of slapende kinderen. En dat terwijl de motor zelf stiller is dan verwacht. Gelukkig neemt de zuigmond moeiteloos allerlei soorten haren op en raken die niet in de borstel verstrengeld. Ook goed om te weten: de Cyclone past zijn zuigkracht niet automatisch aan, zoals duurdere modellen dat wel doen, waardoor je dat dus zelf in de gaten moet houden. Geen groot probleem, maar toch.

©Wesley Akkerman

Batterij en accessoires

Zoals gezegd gaat de batterij maximaal een uurtje mee wanneer je de zuinigste modus inschakelt. Anders moet je rekening houden met ongeveer een halfuur in de normale stand. Zet je de Boost-modus aan en laat je die aanstaan, dan is het binnen tien minuten wel gedaan. Geen vreemde scores als je kijkt naar het formaat en de behoorlijk indrukwekkende zuigkracht. Een groot pluspunt is daarnaast dat je de accu kunt verwisselen. Daardoor kun je de levensduur aanzienlijk verlengen door mettertijd een nieuwe batterij aan te schaffen.

Je krijgt trouwens twee accessoires bij aanschaf van de Dyson de V8 Cyclone: een kierenzuiger en een gemotoriseerde miniborstel. Hoewel dat misschien wat karig lijkt vergeleken met eerdere modellen, zijn oude V8-hulpstukken compatibel (mocht je die nog hebben). In de praktijk blijkt de basisset echter compleet genoeg. De kierenzuiger werkt goed voor meubels en lastige hoeken, terwijl de miniborstel onmisbaar is voor trappen, matrassen en bekleding. Ondanks het beperkte pakket biedt de stofzuiger dus voldoende opties voor de meeste huishoudens.

©Wesley Akkerman

Dyson V8 Cyclone kopen?

De Dyson V8 Cyclone is een geslaagde steelstofzuiger voor wie krachtige prestaties zoekt zonder overbodige luxe. Vooral op tapijt en bekleding komt hij sterk naar voren, en ook het verwijderen van haren gaat hem goed af. Het harde, smalle handvat en de wat stugge vloermond voelen niet altijd even prettig aan, maar dat past deels bij de prijsklasse. Jammer is ook het ontbreken van een lcd-display met handige informatie, al is dat net als het gebrek aan een automatische zuigstand goed te overzien. Alles bij elkaar is dit een betrouwbaar basismodel dat doet wat hij moet doen.

▼ Volgende artikel
Last van hoge energiekosten in de winter? Zo laat je je was en vaat zuiniger draaien
© ID.nl
Huis

Last van hoge energiekosten in de winter? Zo laat je je was en vaat zuiniger draaien

In de winter loopt de energierekening al snel op. De droger gaat vaker aan omdat de was buiten niet droogt, en omdat we vaker thuis koken en eten gaat ook de vaatwasser vaker aan. Ook de wasmachine draait op volle toeren, want nat weer en dikke kleding leveren extra was op. Hét moment dus om even stil te staan bij het energieverbruik van deze drie apparaten. Met wat kleine aanpassingen zorg je voor een zichtbaar (gunstig!) verschil op je stroomrekening.

In het kort

In dit artikel lees je hoe je met eenvoudige ingrepen energie bespaart bij het wassen, drogen en afwassen. We kijken naar slimme instellingen, zuinige programma's en klein onderhoud waarmee je het energieverbruik omlaag brengt.

Lees ook: 5 stille wasmachines met zuinig label

Slim plannen loont

Wie een slimme meter of dynamisch energietarief heeft, kan precies zien wanneer stroom het goedkoopst is. Door het programma van je wasmachine, droger of vaatwasser daarop af te stemmen, draai je letterlijk op de voordeligste momenten. Veel moderne apparaten hebben een startuitstelknop, waarmee je eenvoudig plant dat een was 's nachts of vroeg in de ochtend klaar is.

Heb je geen dynamisch contract, dan is het slim om eerst te kijken of jouw leverancier een piek- en daltarief hanteert. Bij een dubbeltariefmeter geldt het lagere tarief meestal alleen tussen ongeveer 23.00 en 07.00 uur, niet standaard in het weekend. Even checken bij je energieleverancier voorkomt verrassingen.

Gebruik van nachtstroom

Heb je een dubbeltariefmeter, dan betaal je tijdens de daluren vaak minder. Handig om te weten, maar houd rekening met geluid als je apparaten laat draaien terwijl je slaapt. Sluit de deur van het washok of gebruik het stille programma als dat aanwezig is.

Wassen op lagere temperatuur

De grootste energiebesparing zit in de temperatuur van het waswater. Een was van 30 graden is meestal voldoende schoon, zeker met de huidige wasmiddelen die ook bij lage temperatuur goed werken. Alleen bij sterk vervuilde was of handdoeken kan een hogere stand nodig zijn. Een wasbeurt op 60 graden of af en toe een machinereiniger houdt de trommel fris en voorkomt vetluis - een kookwas op 90 graden is bij moderne machines niet meer nodig.

Een andere eenvoudige stap is de wasmachine pas te laten draaien als hij goed vol is. Een halve was verbruikt bijna evenveel energie als een volle: zonde. Ook de juiste dosering helpt: te veel wasmiddel kan op den duur zeepresten achterlaten, waardoor de machine harder moet werken.

Droger of droogrek?

De droger is een onmisbare hulp in de winter, maar verbruikt veel stroom. Centrifugeer je was daarom eerst op de hoogste stand, zodat er minder vocht overblijft. Hoe droger het de trommel ingaat, hoe korter het droogprogramma duurt. Warmtepompdrogers verbruiken het minst stroom, al bespaar je nog meer door de was af en toe op te hangen. In een goed geventileerde kamer, bijvoorbeeld bij de verwarming, droogt het prima zonder dat je ernaar hoeft om te kijken.

Zuiniger én veiliger

Reinig na elke droogbeurt het pluizenfilter en controleer het rooster aan de achterkant. Ophoping van stof belemmert de luchtstroom, waardoor het apparaat langer draait en warmer wordt. Dat verhoogt niet alleen het energieverbruik, maar ook het risico op oververhitting.

Liever niet de wasdroger gebruiken?

Ga voor een droogrek!

De vaatwasser slim inzetten

Een vaatwasser verbruikt vooral energie om water te verwarmen. Kies daarom het eco-programma: dat duurt wat langer, maar gebruikt minder stroom en water doordat het water op lagere temperatuur wordt verwarmd. Grote etensresten kun je beter even wegschrapen, maar spoel servies niet voor onder de kraan - dat is onnodig en verspilt warm water. Licht aangekoekte pannen en schalen vormen voor moderne vaatwassers echt geen probleem.

Wie zonnepanelen heeft, kan de vaatwasser het beste overdag laten draaien, zodat de stroom direct uit eigen opwekking komt. Ook hier geldt dat een startuitstelknop handig is: je plant eenvoudig in dat het programma start zodra de zon op het dak staat.

Onderhoud maakt echt verschil

Goed onderhoud klinkt saai, maar heeft een direct effect op het energieverbruik. Een verstopt filter, kalk in de sproeiarmen of pluis in de droger laten apparaten harder werken dan nodig. Zet ze af en toe op een onderhoudsprogramma of gebruik een speciale reiniger. Dat voorkomt niet alleen geurtjes, maar zorgt ook dat de machine weer zo goed (lees: zo zuinig) mogelijk zijn werk kan doen.

Kleine aanpassingen, harde euro's

Energie besparen is vooral een optelsom van gewoontes. Door slimmer te plannen, de juiste temperatuur te kiezen en je apparaten schoon te houden, daalt het verbruik ongemerkt. En misschien nog belangrijker: je verlengt de levensduur van apparaten die het dagelijks zwaar te verduren hebben. Daarmee bespaar je ook op de langere termijn.