27 Andmed failist

Selles peatükis vaatleme programmi abil failist andmete lugemist. Räägime tekstifailist, csv-failivormingust ning translaatoritest.

Andmed failist

For-tsüklit saame kasutada failist andmete lugemiseks. Selline võimalus annab programmidele uue mõõtme – enam ei pea andmeid programmi sisse kirjutama või kasutajalt sisestamist küsima. Meie piirdume esialgu selliste failidega, mis on ka inimesele loetavad ja arusaadavad. Kasutame lihtsaid tekstifaile, mis koosnevad ridadest.

Näiteprogramm. Faili “andmed.txt” lugemine

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 ühe argumendiga varianti open("andmed.txt"), aga kuna meil võib tulla tegemist täpitähtedega, täpsustame kodeeringu argumendiga encoding="UTF-8".

Faili read saame kätte for-tsükliga. Muutujas fail on küll mõnevõrra keerukam struktuur, aga for-tsükkel oskab sellest ükshaaval ridu lugeda. Tsükli kehas saame konkreetse reaga midagi peale hakata, antud juhul väljastame selle lihtsalt ekraanile.

Võtame järgmise ülesande. Olgu meil fail jooks.txt, kus on kirjas, mitu kilomeetrit tervisesportlane erinevatel kordadel jooksis. Teeme programmi, mis kõik need arvud kokku liidab:

Näiteprogramm. Jooksudistantside summa

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.

Näiteprogramm. Pikkade jooksudistantside summa

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 pikki jookse " + str(kokku) + " kilomeetrit.")

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

Näiteprogramm. Jooksudistantside lugemine järjendisse

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

Enne tsüklit on tehtud tühi järjend: jooksud = []. Tsükli igal sammul lisatakse järjendile realt loetud väärtus: jooksud.append(float(rida)) või jooksud += [float(rida)]. Pärast tsüklit väljastatakse järjendi element, mille indeks on 4.

Kuidas failid tekivad?

Faili, kust andmeid võtta, võib tekitada erineval moel. Lihtsaim neist on fail tekstiredaktoriga kirjutada ja salvestada. Tekstiredaktoriga faili koostades peab jälgima, et tegemist oleks nö plain-tekstiga (nagu seda on txt-vormingus failid). Salvestamisel võiks eelistada UTF-8 kodeeringut, muu kodeeringuga võib vaja minna programmis kodeeringu muutmist.

Meil on võimalik tekstiredaktorina kasutada Thonnyt ennast. Teksti salvestamisel tuleb valida salvestustüübiks text files. Vaikimisi lähevad need failid samasse kausta, kuhu programmidki.

Tohutult palju võimalusi pakuvad avalikud andmebaasid, kust saame sobiva tabeli alla laadida ja seda oma programmi abil töödelda. Vastav näide on selle materjali lõpus. Statistikaandmeid võib alla laadida erinevatelt saitidelt, näiteks www.stat.ee, haridussilm.ee, ec.europa.eu/eurostat.

Seda, kuidas Pythoni programmiga andmeid faili kirjutada, vaatame tulevikus.

Pangaautomaat rahvusvaheliseks

Failidest andmete lugemisega saame täiendada pangaautomaadi programmi nii, et saaks keelt valida.

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

Näiteprogramm. Mitmekeelne pangaautomaat

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)

Selle programmi loomisest on ka video.

Kilpkonna translaator

Faili sisu võib olla hoopis programmitekst. Tegelikult meie programmide tekstid ongi lihtsalt tekstifailid, mille järgi Thonny tegutseb.

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.

Näiteprogramm. Kilpkonna translaator

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 selle programmi vahendusel eestikeelsetest käskudest aru. Järelikult meie programm tõlgib (inglise keeles translating). Selliseid programme, mis programmiteksti arvutile arusaadavaks teevad, nimetatakse translaatoriteks.

Andmed avalikust andmebaasist. csv-vorming

Eespool mainisime avalikke andmebaase. Näiteks statistikaameti kodulehel stat.ee saab statistika andmebaasist pakutavad andmed välja valida ja sobivas vormingus salvestada. Kuigi valikus on ka tekstifail (.txt), on meile siin sobivam tabeldieraldusega pealkirjata tekst (.csv) või semikooloneraldusega pealkirjata tekst (.csv). Mõlemal juhul antakse meile csv-fail. Vormingunimi csv on lühend sõnadest comma-separated values (komaga eraldatud väärtused). Kuigi vahel kasutataksegi väärtuste eraldajana 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.

Näiteprogramm. csv-faili lugemine

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)

Selle programmi loomisest on ka video.

Palun kommenteeri seda materjali Google’i küsimustikus.

Litsents

Icon for the Creative Commons Attribution 4.0 International License

Programmeerimine on loodud Eno Tõnisson, Tauno Palts, Merilin Säde, Kaarel Tõnisson jt poolt Creative Commons Attribution 4.0 International License litsentsi alusel, kui pole teisiti märgitud.

Jaga seda raamatut