Lihtsam failitöötlus
Sageli tekib soov andmeid kuhugi salvestada. Siin peatükis vaatamegi põgusalt, kuidas faili andmeid kirjutada ja ka neid sealt hiljem lugeda.
Failist lugemine
Olgu meil tekstifail andmed.txt, mille sisuks on inimeste nimed ja nende vanused:
Taavi
33
Mia
17
Karl
22
Sirli
31
Oletame, et soovime sealt kätte saada nimed ja neid nimesid tervitada.
Selleks, et Python suudaks tekstifaili lugeda, peab tekstifail olema samas kaustas, kuhu on salvestatud Pythoni (py) fail, või vajadusel andma ette asukohatee, kus fail arvutis asub.
Faili saame avada käsuga open
ja sulgeda käsuga close
. Käsuga open
faili avades tuleb tähele panna, et kui failis on sõned, siis peaks ette andma ka kodeeringu. Eesti tähtedega on piisav kodeering UTF-8. Failist rida-haaval lugemiseks saame kasutada käsklust readline
. Näiteks kui tahame eelolevast failist lugeda ja ekraanile väljastada ainult esimese rea, saame seda teha selliselt:
fail = open("tekst.txt", encoding = "UTF-8") print(fail.readline()) fail.close()
Kuna selliselt väljastatakse ekraanile ka failis igal real olev reavahetus, siis tasub proovida failist lugemisel puhastada rida reavahetustest käsuga fail.readline().strip()
. Kaks rida failist saame ekraanile väljastada, kui korrata käsklust readline
.
Kui fail on pikem või me ei tea, mitu rida failis on, siis pole paraku selline lähenemine väga jätkusuutlik. Siis võiks kasutada tsükli abi kuni ridu leidub või on tühi rida selliselt:
fail = open("tekst.txt", encoding = "UTF-8") while True: rida = fail.readline() if not rida: break else: print(rida.strip()) fail.close()
Teine võimalus on lugeda kõiki ridu failist kasutades tsükli konstruktsiooni for rida in fail
. Reavahetuse eemaldamiseks kasutame endiselt käsklust strip
:
fail = open("andmed.txt", encoding = "UTF-8") for rida in fail: print(f"Tere, {rida.strip()}!") fail.close()
Kui soovime aga eristada arvulisi andmeid sõnedest ja ekraanile väljastada ainult sõned, siis saame need tuvastas if-lausega järgnevalt:
fail = open("andmed.txt", encoding = "UTF-8") for rida in fail: if rida.strip().isdigit(): continue else: print(f"Tere, {rida.strip()}!") fail.close()
Kokkuvõttes for-tsükkel läbib ükshaaval kõik failiread (mis on salvestatud muutujasse fail
)) ning kasutame arvu tuvastamiseks tingimuslauset ning sõnetöötluse funktsioone isdigit
ja strip
. Kuna me soovime tervitada ainult inimesi, siis peaksime kontrollima, kas kõik on ikka sõned. Kui on tegemist sõnega, siis tervitame koos sõnega.
Veel failist lugedes jääb iga rea taha \n
märk, sest see aitab Pythonil ära tunda rea lõppu. Selle eemaldamiseks saab kasutada käsku strip
.
Lugemine veebist
Erinevalt failist lugemisest, tuleb veebist lugedes käsu open
asemel tuleb kasutada käsku urlopen
, mis on vaja eelnevalt importida moodulist urllib.request
:
from urllib.request import urlopen vastus = urlopen("http://artscene.textfiles.com/asciiart/simpsons.txt") baidid = vastus.read() # veebist lugemisel annab käsk read() meile tavalise sõne asemel hunniku baite, # mis on vaja veel sõneks "dekodeerida" tekst = baidid.decode("utf-8") print(tekst) vastus.close()
Faili kirjutamine
Varasemalt puutusime kokku, kuidas faili avada ja sealt infot kätte saada. Tegelikult on oluline ka faili kirjutamine, et saaksime faili kasutada andmete salvestamiseks. Selleks, et faili andmeid kirjutada, peame päises deklareerima, et soovime kasutada funktsiooni write
.
fail = open("andmed.txt", "w")
w
tähendabki write, saame kasutada ka r
, mis tähendab read, aga see on ka vaikelahendus, mida ei pea eraldi märkima. Lisaks parameetrile write on olemas faili lisamiseks ka append, mida tähistatakse a
-ga.
Tähelepanu! Täht "a" ehk append lisab andmed faili lõppu, aga täht "w" ehk write kustutab eelneva faili ja kirjutab etteantud andmed asemele.
Selleks, et faili kirjutada, on käsk write
.
fail = open("Uus.txt", "w") fail.write("1\n") fail.write("2\n") fail.close()
Eelneva programmi käivitamisel kirjutatakse alati faili sisu üle. Kui aga soovime, et faili kirjutataks juurde ridu, siis saame kasutada parameetrit "a".
fail = open("Uus.txt", "a") fail.write("1\n") fail.write("2\n") fail.close()
Selliselt lisatakse andmed faili juurde eelmisi ridu muutmata. Katseta iseseisvalt mõlemad viisid läbi!
Kapoti all: stdin
ja stdout
Ilmselt märkasid teatud sarnasust print
ja write
ning input
ja readline
vahel. Tegelikult on nende kahe käsupaari seosed palju tihedamad kui paistab. Nimelt käsitletakse operatsioonisüsteemi tasemel kasutaja sisendit justkui mingit virtuaalset faili, millesse tekivad uued read iga kord kui kasutaja klaviatuuril midagi tipib ja vajutab ENTER-it – seda faili nimetatakse stdin
-iks ehk standarsisendiks. Analoogselt on olemas virtuaalne fail, kuhu kirjutades ilmuvad read kasutaja konsoolile – seda faili nimetatakse stdout
-iks ehk standarväljundiks. Need failid ei asu tegelikult failisüsteemis ja viited neile organiseeritakse iga programmi jaoks operatsioonisüsteemi poolt, seetõttu pole neid kunagi vaja ise avada ega sulgeda.
Pythonis saab viited neile failidele kätte moodulist sys
ja nende kasutamist demonstreerib järgnev näide:
from sys import stdout, stdin stdout.write("Palun sisesta oma nimi ja vajuta ENTER: ") nimi = stdin.readline().strip() stdout.write("Tere " + nimi + "!")
Käsud print
ja input
ongi lihtsalt mugavamad viisid nende failide kasutamiseks.
Failist ja veebist lugemise video
Enesekontroll