Het schrijven in een tekstbestand lijkt veel op het lezen uit een tekstbestand. Je opent het bestand, schrijft erin, en sluit het weer.
Om een bestand te openen voor schrijven, en voor schrijven alleen, geef
je de waarde "w"
mee als tweede argument aan de open()
functie. Als
het bestand nog niet bestaat, wordt het gecreëerd. Bestaat het wel, dan
wordt het leeggemaakt.
Ik herhaal: als je een bestand opent voor schrijven en het bestand bestaat al, dan wordt de inhoud van het bestand zonder pardon weggegooid! Je zult geen waarschuwing krijgen die zegt “weet je het zeker?” Het bestand wordt gewoon leeggemaakt. Dus je moet heel erg voorzichtig zijn met het openen van een bestand voor schrijven. Gewoonlijk vraag ik studenten om hun programma’s zo te schrijven dat eerst gecontroleerd wordt of een bestand bestaat alvorens het voor schrijven wordt geopend, en als het bestaat, een foutmelding te geven. Functies om te controleren of een bestand bestaat volgen later in dit hoofdstuk.
write()
Om iets te schrijven naar een tekstbestand, gebruik je de write()
methode met als argument een string die je wilt schrijven naar het
bestand. De code hieronder vraagt je om een paar strings in te geven, en
schrijft ze dan naar een bestand. Het programma stopt met het vragen om
strings als je een lege string ingeeft. Aan het einde opent het
programma het geschreven bestand, leest de inhoud, en toont die op het
scherm. Voer deze code uit, geef op zijn minst twee strings in, en zie
wat er gebeurt.
fp = open( "pc_writetest.tmp", "w" )
while True:
tekst = input( "Geef een regel tekst: " )
if tekst == "":
break
fp.write( tekst )
fp.close()
fp = open( "pc_writetest.tmp" )
buffer = fp.read()
fp.close()
print( buffer )
Als je hebt gedaan wat ik vroeg, zie je dat alle tekst die je hebt
ingegeven in het bestand staat, maar dat alles op één lange regel staat.
Er staan geen newline tekens in het bestand. De reden is dat je newline
tekens expliciet moet schrijven als je ze in het bestand wilt hebben.
Als je input van het toetsenbord leest via de input()
functie, stop je
weliswaar met input verstrekken door op Enter
te drukken, maar dat
heeft dan niet als resultaat dat er een newline teken in de ingegeven
string staat. Dus je moet dat newline teken zelf toevoegen als je die
nieuwe regels wilt zien.
Pas de code hierboven aan zodat er een newline teken in het bestand komt te staan na iedere ingegeven regel.
writelines()
Je kunt een list van strings in één keer naar een bestand schrijven, via
de writelines()
methode die de list als argument krijgt. Als je
newline tekens tussen de strings wilt, moet je die expliciet opnemen aan
het einde van iedere string in de list. writelines()
is de tegenhanger
van readlines()
; als je de list die readlines()
retourneert als
argument voor writelines()
gebruikt, zal de inhoud van het
uitvoerbestand exact gelijk zijn aan de inhoud van het invoerbestand.
Er is geen writeline()
methode. writeline()
zou precies hetzelfde
zijn als write()
, dus hij is overbodig.
Schrijf een programma dat de inhoud van “pc_rose.txt” leest, en exact dezelfde inhoud schrijft in een bestand “pc_writetest.tmp.” Open dan het bestand “pc_writetest.tmp” en toon de inhoud. Je kunt dit programma gemakkelijk bouwen door wat van de hierboven gegeven code bij elkaar te plakken.
Schrijf een programma dat de inhoud van “pc_rose.txt” leest, iedere regel achterstevoren zet, en dan de geïnverteerde regels wegschrijft naar het bestand “pc_writetest.tmp.” Open daarna “pc_writetest.tmp” en toon de inhoud.