Institute of Computer Science
  1. Courses
  2. 2025/26 fall
  3. Computer Programming (LTAT.03.001)
ET
Log in

Computer Programming 2025/26 fall

  • Üldinfo
  • 1. Muutuja ja avaldis
  • 2. Tingimuslause
  • 3. Funktsioon
  • 4. Korduslause
  • 5. Sõned. Lihtsam failitöötlus
5.1 Sõned
5.2 Lihtsam failitöötlus
5.3 Kodutöö
5.4 Harjutused
5.5 Silmaring: kodeerimine ja krüpteerimine
  • 6. Kontrolltöö 1
  • 7. Järjend
  • 8. Järjend 2
  • 9. Kahekordne tsükkel. Failitöötlus
  • 10. Andmestruktuurid
  • 11. Andmestruktuurid 2
  • 12. Kontrolltöö 2
  • 13. Objektorienteeritud programmeerimine
  • 14. Objektorienteeritud programmeerimine 2
  • 15. Rekursioon
  • 16. Kordamine. Projektide esitlused
  • Viiteid
  • Silmaringimaterjalid
  • Materjalid

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

  • Institute of Computer Science
  • Faculty of Science and Technology
  • University of Tartu
In case of technical problems or questions write to:

Contact the course organizers with the organizational and course content questions.
The proprietary copyrights of educational materials belong to the University of Tartu. The use of educational materials is permitted for the purposes and under the conditions provided for in the copyright law for the free use of a work. When using educational materials, the user is obligated to give credit to the author of the educational materials.
The use of educational materials for other purposes is allowed only with the prior written consent of the University of Tartu.
Terms of use for the Courses environment