Arvutiteaduse instituut
  1. Kursused
  2. 2024/25 kevad
  3. Programmeerimise alused (MTAT.03.236)
EN
Logi sisse

Programmeerimise alused 2024/25 kevad

  • Pealeht
  • 1. Sissejuhatus
  • 2. Tingimuslause
  • 3. Tsükkel
  • 4. Järjend ja for-tsükkel
  • 5. Funktsioon
  • 6. Andmevahetus. Lihtne kasutajaliides
  • Loengud
  • Moodle
  • Lahendus
  • Thonny paigaldamine
  • Thonny logide esitamine
  • Silumine
  • Kiireksamist
  • Viited
< eelmine6. nädala sisukordjärgmine >

6.2 Lugemine failist

LUGEMINE FAILIST. TÕDE JA ÕIGUS

Juba siis, kui tutvusime for-tsükliga, tõime välja võimaluse selle abil failist lugeda. Oleme seda võimalust ka korduvalt kasutanud.

failinimi = input("Sisesta faili nimi: ")
fail = open(failinimi, encoding="UTF-8")
for rida in fail:
    print(f"Lugesin sellise rea: {rida}")
fail.close()

Pikema teksti lugemise ja analüüsimise näitena võtame käsile Anton Hansen Tammsaare "Tõe ja õiguse" 1. köite. Tegemist on meie rahva ühe tüvitekstiga, mida siin omalaadselt käsitleme. Valdur Mikita on Sirbis kirjutanud: "Rahvas, kelle kõige kuulsam kirjandusteos on viieköiteline sookuivendamise käsiraamat, ei saa olla normaalne – ja ei peagi. Võimalik, et meil on ilmaruumis hoopis üks teine asi ajada."

Kõigepealt tuleb tekst arvutisse laadida siit. (Kes tahab, võib proovida ka programselt veebist lugemist.)

Järgmine programm loendab, mitu korda on tekstis sõna "tõde" ja mitu korda "õigus".

failinimi = input("Sisesta faili nimi: ")
f = open(failinimi, encoding='UTF-8')

tõde = 0 # loendaja
õigus = 0 # loendaja

for rida in f: # ridade kaupa
    sõnad = rida.split() # rea sõnad järjendisse
    for s in sõnad: # sõnade kaupa
        if s == "tõde":
            tõde += 1
        if s == "õigus":
            õigus += 1

print(f"Failis sõna 'tõde' on {tõde} korda.") 
print(f"Failis sõna 'õigus' on {õigus} korda.") 

f.close()

Valikvastustega enesekontrolliülesanne

See programm leidis ainult täpselt sõnade "tõde" ja "õigus" arvud. Kui tahame, et arvesse tuleksid ka need juhud, kus vahetult sõna järel on mingi kindel kirjavahemärk, siis saame kasutada järgmisi võrdlusi. Antud juhul siis võetakse arvesse need juhud, kus sõna järel on punkt, koma või küsimärk.

        if s.strip(".,?") == "tõde":
            tõde += 1
        if s.strip(".,?") == "õigus":
            õigus += 1

Nüüd vaatame varianti, kus kontrollitakse, kas sõna "tõde" ("õigus") sisaldub vaadeldavas sõnes.

        if "tõde" in s:
            tõde += 1
        if "õigus" in s:
            õigus += 1

Kui tahame suurte tähtedega variante arvesse võtta, siis saame seda teha, muutes sõne väiketäheliseks.

        if "tõde" in s.lower():
            tõde += 1
        if "õigus" in s.lower():
            õigus += 1

Automaatkontrolliga enesekontrolliülesanne

VEEL FAILIST LUGEMISEST. FUNKTSIOON readline

Vaatleme veel mõningaid võimalusi, kuidas failidest andmeid kätte saada. Alustame funktsiooniga readline, mis võtab failist järgmise rea. Esialgu aga teeme Thonny endaga või mõne tekstiredaktoriga faili andmed2.txt, kust andmeid võtame. Esimesel real on inimese nimi, teisel real vanus (täisarvuna) ning kolmandal real meiliaadress.

Fail peab olema plain-text kujul (laiendiga .txt), näiteks Wordi fail (laiendiga .doc vms) ei sobi.

failinimi = input("Sisesta faili nimi: ")
f = open(failinimi, encoding="UTF-8")

nimi = f.readline()
vanus = f.readline()
aadress = f.readline()

print(f"Nimi: {nimi}")
print(f"Vanus: {vanus} aastat")
print(f"Aadress: {aadress}")

f.close()

Vaatame lähemalt, mis toimub.

failinimi = input("Sisesta faili nimi: ")

Küsime kasutajalt faili nime ja see salvestatakse muutujasse failinimi. Oluline on, et kasutaja sisestaks faili nime koos laiendiga, nt andmed2.txt.

f = open(failinimi, encoding="UTF-8")

Käsk open otsib failisüsteemist üles soovitud faili ja tagastab viite sellele (antud näites salvestasime selle viite muutujasse f, mis on levinud nimi failide tähistamiseks). Kui tahame avada faili samast kaustast, kus asub programm, siis piisab vaid muutujast, kus on faili nimi koos laiendiga: f = open(failinimi). Selleks, et täpitähed õigesti paistaksid, täpsustame kodeeringut encoding="UTF-8".

nimi = f.readline()

Rida nimi = f.readline() loeb failist ühe rea, milles on meie näites isiku nimi, ning annab selle väärtuseks muutujale nimi. Järgmisel korral sama käsku kasutades loetakse juba järgmine rida - meie näites vanus.

f.close()

Käsk f.close() paneb faili kinni.

Programmi tööle pannes näeme, et väljundis tekib üleliigseid tühje ridu. Nimelt jäetakse iga rea lõppu alles ka failist pärinev reavahetuse sümbol. Tekstifailides tähistatakse reavahetust sarnaselt Pythoniga: kui Pythoni sõne sisse kirjutame sümboli \n, siis tähendab see Pythoni jaoks reavahetust. Iga kord kui tekstiredaktoris järgmise rea ette võtate, sisestab programm teie eest faili reavahetuse märgi. See reavahetuse märk jäetakse alles, kui nüüd failist teksti loeme. Kui soovime, et üleliigseid ridu ei tuleks, saame kasutada meetodit strip iga rea lugemisel, nt nimi = f.readline().strip().

FUNKTSIOONID readlines JA read

Lisaks funktsioonile readline saab failist info kätte ka funktsiooniga readlines.

failinimi = input("Sisesta faili nimi: ")
f = open(failinimi, encoding="UTF-8")
loetud = f.readlines()
f.close() # faili ei lähe enam vaja
print(loetud)

Näeme, et muutujas loetud on list, mille iga element on üks rida näidatud failist.

Veebist lugemisel kasutasime funktsiooni read. Seda saame kasutada ka failist lugemise korral. Nii saame kogu faili sisu ühe sõnena.

failinimi = input("Sisesta faili nimi: ")
f = open(failinimi, encoding="UTF-8")
loetud = f.read()
f.close() # faili ei lähe enam vaja
print(loetud)

Võime aga märkide arvu (antud juhul 5) ka ette anda.

failinimi = input("Sisesta faili nimi: ")
f = open(failinimi, encoding="UTF-8")
loetud = f.read(5)
f.close() # faili ei lähe enam vaja
print(loetud)

Etteantud märkide arv võib olla ka üks, siis võetakse märke ühekaupa. Järgmine programm on inspireeritud asjaolust, et SMSi saatmisel on õ-tähte sisaldavate sõnumite maksimaalne pikkus märgatavalt väiksem. Sageli asendatakse täht õ numbriga 6. Teeme vastava programmi

failinimi = input("Sisesta faili nimi: ")
f = open(failinimi, encoding="UTF-8")

while True: # lõpmatu tsükkel, kui ei katkestata 
    sümbol = f.read(1) # loetakse üks sümbol
    if sümbol == "": # kui enam pole
        break # tsükkel katkestatakse
    if sümbol == "õ":
        print("6", end = "") # reavahetust ei tule
    else:
        print(sümbol, end = "") # reavahetust ei tule

f.close() # faili ei lähe enam vaja

Sama ülesande saab lahendada ka kahe for-tsükliga. Välimine tsükkel tegutseb ridade kaupa. Sisemisel võetakse vastavast reast sümboleid.

failinimi = input("Sisesta faili nimi: ")
f = open(failinimi, encoding="UTF-8")

for rida in f: # ridade kaupa
    for sümbol in rida: # sümbolite kaupa
        if sümbol == "õ":
            print("6", end = "") # reavahetust ei tule
        else:
            print(sümbol, end = "") # reavahetust ei tule

f.close() # faili ei lähe enam vaja

Toome ka kolmanda variandi, kus funktsiooni read() saame faili kogu sisu ühe sõnena käsitleda. Selles sõnes muudame funktsiooni replace abil kõik tähed õ numbriteks 6.

failinimi = input("Sisesta faili nimi: ")
f = open(failinimi, encoding="UTF-8")

failisisu = f.read()

asendatudõ = failisisu.replace("õ","6")

print(asendatudõ)

f.close()

Valikvastustega enesekontrolliülesanne

Automaatkontrolliga enesekontrolliülesanne


< eelmine6. nädala sisukordjärgmine >
  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Courses’i keskkonna kasutustingimused