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

Programmeerimise alused 2022/23 kevad

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

4.3 Andmed failist

ANDMED FAILIST

For-tsüklit saame kasutada ka failist andmete lugemiseks. Selline võimalus annab programmidele uue mõõtme - enam me ei pea andmeid programmi sisse kirjutama või kasutajalt sisestamist küsima. Failis võivad andmed olla erineva struktuuriga, näiteks krüpteeritult. Meie piirdume, vähemalt esialgu, selliste failidega, mis on ka inimesele loetavad ja arusaadavad. Räägime lihtsatest tekstifailidest, mis koosnevad ridadest. Failide sisselugemiseks saab kasutada järgmist programmi.

fail = open("andmed.txt", encoding="UTF-8") 
for rida in fail: 
    print("Lugesin sellise rea: " + rida) 
fail.close()

Andmed loetakse failist andmed.txt, mis on programmiga samas kaustas. Faili avamisel oleks võinud kasutada ka ühe argumendiga varianti open("andmed.txt"), aga kuna meil võib tulla tegemist täpitähtedega, täpsustame kodeeringut. Pärast andmete lugemist tuleks fail sulgeda käsuga close(). Muidu jääb fail vahepealsesse seisu ja andmete uuesti lugemiseks tuleb see uuesti avada. Faili suletust saab kontrollida käsuga closed.

>>> fail.closed
True

Kui unustate faili sulgeda, teeb Pythoni prügikoristaja (garbage collector) seda töö lõpus automaatselt, kuid fail võib jääda mingi aja jooksul veel avatuks ja teised kasutajad ei saa sinna kirjutada. Faili pole vaja sulgeda, kui see avatakse käsuga with, mis suleb faili automaatselt.

with open("andmed.txt", encoding="UTF-8") as fail:
    for rida in fail:
        print("Lugesin sellise rea: " + rida)
print("fail.closed =",fail.closed)

Failist saame read for-tsükliga järjest kätte. Muutujas fail pole siiski järjend vaid mõnevõrra keerukam struktuur, millega aga for-tsükkel kenasti hakkama saab. Tsükli kehas saame konkreetse reaga midagi peale hakata, antud juhul see lihtsalt väljastati ekraanile. Tegelikult aga saab olenevalt rea tähendusest väga huvitavaid ja kasulikke asju teha.

Olgu meil näiteks fail jooks.txt, kus on kirjas, mitu kilomeetrit tervisesportlane erinevatel kordadel jooksis. Teeme programmi, mis kõik need arvud kokku liidab.

fail = open("jooks.txt", encoding="UTF-8")
kokku = 0
for rida in fail:
    kokku += float(rida)
fail.close()
print("Kokku joosti " + str(kokku) + " kilomeetrit.")

Muidugi võib tsükli kehas ka rohkem ridu olla. Näiteks liidame kokku ainult need jooksud, mil joosti üle 10 kilomeetri.

fail = open("jooks.txt", encoding="UTF-8")
kokku = 0
for rida in fail:
    kilomeetreid = float(rida)
    if kilomeetreid > 10:
        kokku += kilomeetreid
fail.close()
print("Kokku joosti " + str(kokku) + " kilomeetrit.")

Kui tahame andmetega midagi edasi teha, siis võib olla mõistlik need järjendisse panna.

fail = open("jooks.txt", encoding="UTF-8")
kokku = 0
jooksud = []
for rida in fail:
    jooksud.append(float(rida))
    # 2. võimalus jooksud += [float(rida)]      
fail.close()
print(jooksud[4])

Enne tsüklit on tehtud tühi järjend: jooksud = []. Tsükli igal sammul järjend pikeneb: jooksud.append(float(rida)) või jooksud += [float(rida)].

Pärast tsüklit väljastatakse järjendi element, mille indeks on 4.

Kontrollülesande 4.3 peaks saama lahendatud juba eeltoodud materjali põhjal.

KUIDAS FAILID TEKIVAD?

Eespool olevates näidetes oli fail, kust andmeid võtta, juba olemas. Selline fail võib olla tekkinud väga erineval moel. Seda, kuidas Pythoni programmiga saab andmeid faili kirjutada, vaatame edaspidi. Tekstiredaktoriga faili koostades peab jälgima, et tegemist oleks lihtsa nö plain-tekstiga. Salvestamisel võiks valikute korral eelistada UTF-8 kodeeringut. Muude korral võib vaja minna programmis kodeeringu muutmist.

Meil on võimalik tekstiredaktorina kasutada Thonnyt ennast. Salvestamisel tuleb lihtsalt salvestustüübina text files valida. Vaikimisi lähevad need failid samasse kausta, kus programmidki ja see meile sobib.

Tohutult palju võimalusi pakuvad avalikud andmebaasid, kust saame kõigepealt sobiva tabeli alla laadida ja seda siis oma programmi abil analüüsida. Vastav näide on selle materjali lõpus. Siinkohal lihtsalt mõned lingid: http://www.stat.ee/, http://haridussilm.ee/, http://ec.europa.eu/eurostat.

PANGAAUTOMAAT RAHVUSVAHELISEKS

Failidest andmete saamisega saame täiendada pangaautomaadi programmi nii, et saaks keelt valida. Selle programmi loomisest on ka video.

Programmi tööks vajalikud failid on est.txt, eng.txt ja ger.txt.


from time import sleep

keel = int(input("1) Eesti 2) English 3) Deutsche "))

if keel == 2:
    failinimi = "eng.txt"
elif keel == 3:
    failinimi = "ger.txt"
else:
    failinimi = "est.txt"

readfailist = open(failinimi, encoding = "UTF-8") 
read = [] #ilma reavahetusteta ridade list 
for rida in readfailist: #reakaupa listist readfailist
        read = read + [rida.strip("\n")] #ilma reavahetuseta rida lisatakse listi
        # või read.append(rida.strip("\n"))
readfailist.close() # faili ei lähe enam vaja

sisestatud_pin = ""
katseid = 3
while sisestatud_pin != "1234" and katseid > 0:
    print(read[0])
    print(read[1] + str(katseid) + read[2])
    katseid -= 1
    sisestatud_pin = input()
if sisestatud_pin == "1234":
    print(read[3])
else:
    print(read[4])
    i = 10
    while i > 0:
        print(i)
        i -= 1
        sleep(1)

KILPKONNA TRANSLAATOR

Failis võib olla hoopis programmitekst. Tegelikult ju meie programmide tekstid ongi lihtsalt tekstifailid. Olgu meil näiteks failis kirjas, kuidas kilpkonn peaks liikuma

    edasi 40
    paremale 90
    edasi 50
    tagasi 30
    vasakule 90
    edasi 30

Kirjutame sellise programmi, mis selle teksti kilpkonnale arusaadavaks tõlgib.


from turtle import *

# faili avamine
fail = open("kilpkonn.txt")
# faili töötlemine ja kilpkonnaga joonistamine
for rida in fail:
    osad = rida.split()  # tühikute kohal osadeks
    liikumine = osad[0] # kuidas liikuda
    arv = int(osad[1]) # kui palju
    if liikumine == "vasakule":
        left(arv)
    elif liikumine == "paremale":
        right(arv)
    elif liikumine == "edasi":
        forward(arv)
    elif liikumine == "tagasi":
        backward(arv)
    else: 
        print("Ei saa sellest käsust aru!")

fail.close()
exitonclick()

Näeme, et kilpkonn saigi niimoodi eestikeelsetest käskudest aru. Programm oskab tõlkida (ingl translating)! Tegelikult nimetataksegi selliseid programme, mis programmiteksti arvutile arusaadavaks teevad translaatoriteks.

AVALIKUST ANDMEBAASIST

Eespool juba mainisime avalikke andmebaase. Näiteks statistikaameti kodulehel https://www.stat.ee/ on väga palju huvitavat informatsiooni. Siin saab ise andmeid valida ja sobivas formaadis salvestada. Kuigi pakutakse ka tekstifaili, on meile siin sobivam tabeldieraldusega pealkirjata tekst (.csv) või semikooloneraldusega pealkirjata tekst (.csv). Mõlemal juhul tekib csv-fail. Formaadinimi csv on lühend sõnadest comma-separated values (komaga eraldatud väärtused). Kuigi vahel kasutataksegi väärtuste eraldajana tõesti koma, siis paljudel juhtudel on eraldajaks hoopis tabeldusmärk (Pythonis "\t") või semikoolon.

Näiteks võib rida failis RV031sm.csv olla selline (loomulik iive 1923. aastal). "1923";3636

Nüüd on vaja see rida semikooloni kohalt osadeks jaotada ja osad täisarvudena esitada. Osadeks saab jaotada funktsiooni split abil, mis tekitab antud juhul kahe elemendiga sõnejärjendi. Üks element on sõne '"1923"' ja teine '3636'. Tegelikult tahame mõlemal juhul saada täisarve. Kuna esimesel juhul on sõnes endas jutumärgid, siis tuleb need eemaldada näiteks funktsiooni strip abil.

readfailist = open("RV031sm.csv") 
aastad = [] # järjend aastate jaoks
iibed = [] # järjend iivete jaoks
for rida in readfailist: # reakaupa listist readfailist
    realt = rida.split(';') # jaotada semikooloni kohalt
    aastad += [int(realt[0].strip('"'))] # aastate järjendisse juurde
    # või aastad.append(int(realt[0].strip('"')))
    iibed += [int(realt[1])] # iivete järjendisse juurde
    # või iibed.append(int(realt[1]))
readfailist.close() # faili ei lähe enam vaja
print(aastad)
print(iibed)

Järgnevas videos on seda temaatikat põhjalikumalt näidatud.


< eelmine4. 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