Materjalid koostas ja kursuse viib läbi
Tartu Ülikooli arvutiteaduse instituudi programmeerimise õpetamise töörühm
< eelmine | 5. nädala sisukord | järgmine > |
5.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.
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 5.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.
< eelmine | 5. nädala sisukord | järgmine > |