{"id":148,"date":"2018-12-19T19:25:08","date_gmt":"2018-12-19T19:25:08","guid":{"rendered":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/?post_type=chapter&#038;p=148"},"modified":"2026-01-06T13:39:55","modified_gmt":"2026-01-06T13:39:55","slug":"andmed-failist","status":"publish","type":"chapter","link":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/chapter\/andmed-failist\/","title":{"raw":"Andmed failist","rendered":"Andmed failist"},"content":{"raw":"Selles peat\u00fckis vaatleme programmi abil failist andmete lugemist. R\u00e4\u00e4gime tekstifailist, <em>csv<\/em>-failivormingust ning translaatoritest.\r\n<h2>Andmed failist<\/h2>\r\n<em>For<\/em>-ts\u00fcklit saame kasutada failist andmete lugemiseks. Selline v\u00f5imalus annab programmidele uue m\u00f5\u00f5tme - enam ei pea andmeid programmi sisse kirjutama v\u00f5i kasutajalt sisestamist k\u00fcsima. Meie piirdume esialgu selliste failidega, mis on ka inimesele loetavad ja arusaadavad. Kasutame lihtsaid tekstifaile, mis koosnevad ridadest.\r\n\r\n<strong>N\u00e4iteprogramm. Faili \"andmed.txt\" lugemine<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">fail = open(\"andmed.txt\", encoding=\"UTF-8\")\r\nfor rida in fail:\r\n    print(\"Lugesin sellise rea: \" + rida)\r\nfail.close()<\/pre>\r\nAndmed loetakse failist <em>andmed.txt<\/em>, mis on programmiga samas kaustas. Faili avamisel oleks v\u00f5inud kasutada \u00fche argumendiga varianti <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">open(\"andmed.txt\")<\/code>, aga kuna meil v\u00f5ib tulla tegemist t\u00e4pit\u00e4htedega, t\u00e4psustame kodeeringu argumendiga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">encoding=\"UTF-8\"<\/code>.\r\n<p class=\"vspace\">Faili read saame k\u00e4tte <em>for<\/em>-ts\u00fckliga. Muutujas <code>fail<\/code> on k\u00fcll m\u00f5nev\u00f5rra keerukam struktuur, aga <em>for<\/em>-ts\u00fckkel oskab sellest \u00fckshaaval ridu lugeda. Ts\u00fckli kehas saame konkreetse reaga midagi peale hakata, antud juhul v\u00e4ljastame selle lihtsalt ekraanile.<\/p>\r\n<p class=\"vspace\">V\u00f5tame j\u00e4rgmise \u00fclesande. Olgu meil fail <a class=\"urllink\" href=\"https:\/\/courses.cs.ut.ee\/2023\/eprogalused\/fall\/Main\/HomePage?action=download&amp;upname=jooks.txt&amp;disposition=attachment\" target=\"_blank\" rel=\"noopener noreferrer\">jooks.txt<\/a>, kus on kirjas, mitu kilomeetrit tervisesportlane erinevatel kordadel jooksis. Teeme programmi, mis k\u00f5ik need arvud kokku liidab:<\/p>\r\n<strong>N\u00e4iteprogramm. Jooksudistantside summa<\/strong>\r\n<pre class=\"EnlighterJSRAW\">fail = open(\"jooks.txt\", encoding=\"UTF-8\")\r\nkokku = 0\r\nfor rida in fail:\r\n    kokku += float(rida)\r\nfail.close()\r\nprint(\"Kokku joosti \" + str(kokku) + \" kilomeetrit.\")<\/pre>\r\nMuidugi v\u00f5ib ts\u00fckli kehas ka rohkem ridu olla. N\u00e4iteks liidame kokku ainult need jooksud, mil joosti \u00fcle 10 kilomeetri.\r\n\r\n<strong>N\u00e4iteprogramm. Pikkade jooksudistantside summa<\/strong>\r\n<pre class=\"EnlighterJSRAW\">fail = open(\"jooks.txt\", encoding=\"UTF-8\")\r\nkokku = 0\r\nfor rida in fail:\r\n    kilomeetreid = float(rida)\r\n    if kilomeetreid &gt; 10:\r\n        kokku += kilomeetreid\r\nfail.close()\r\nprint(\"Kokku joosti pikki jookse \" + str(kokku) + \" kilomeetrit.\")<\/pre>\r\nKui me tahame andmetega midagi edasi teha, siis v\u00f5ib olla m\u00f5istlik panna need j\u00e4rjendisse.\r\n\r\n<strong>N\u00e4iteprogramm. Jooksudistantside lugemine j\u00e4rjendisse\r\n<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">fail = open(\"jooks.txt\", encoding=\"UTF-8\")\r\nkokku = 0\r\njooksud = []\r\nfor rida in fail:\r\n    jooksud.append(float(rida))\r\n    # teine variant: jooksud += [float(rida)]     \r\nfail.close()\r\nprint(jooksud[4])<\/pre>\r\n<p class=\"vspace\">Enne ts\u00fcklit on tehtud t\u00fchi j\u00e4rjend: <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">jooksud = []<\/code>. Ts\u00fckli igal sammul lisatakse j\u00e4rjendile realt loetud v\u00e4\u00e4rtus: <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">jooksud.append(float(rida))<\/code><\/code> v\u00f5i <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">jooksud += [float(rida)]<\/code>. P\u00e4rast ts\u00fcklit v\u00e4ljastatakse j\u00e4rjendi element, mille indeks on 4.<\/p>\r\nPS! Vastavalt sellele, kas failis on ridadel t\u00e4isarvud v\u00f5i ujukomaarvud, peaks need j\u00e4rjendisse lisades teisendama vastavalt arvudeks kasutades funktsiooni <strong>int()<\/strong> v\u00f5i <strong>float()<\/strong>. K\u00fcll aga s\u00f5ne puhul oleks hea s\u00f5ne l\u00f5pust \u00e4ra v\u00f5tta reavahetus k\u00e4suga <strong>strip()<\/strong>.\r\n<h2>Kuidas failid tekivad?<\/h2>\r\n<p class=\"vspace\">Faili, kust andmeid v\u00f5tta, v\u00f5ib tekitada erineval moel. Lihtsaim neist on fail tekstiredaktoriga kirjutada ja salvestada. Tekstiredaktoriga faili koostades peab j\u00e4lgima, et tegemist oleks n\u00f6 <em>plain<\/em>-tekstiga (nagu seda on <em>txt<\/em>-vormingus failid). Salvestamisel v\u00f5iks eelistada UTF-8 kodeeringut, muu kodeeringuga v\u00f5ib vaja minna programmis kodeeringu muutmist.<\/p>\r\n<p class=\"vspace\">Meil on v\u00f5imalik tekstiredaktorina kasutada Thonnyt ennast. Teksti salvestamisel tuleb valida salvestust\u00fc\u00fcbiks <em>text files<\/em>. Vaikimisi l\u00e4hevad need failid samasse kausta, kuhu programmidki.<\/p>\r\n<p class=\"vspace\">Tohutult palju v\u00f5imalusi pakuvad avalikud andmebaasid, kust saame sobiva tabeli alla laadida ja seda oma programmi abil t\u00f6\u00f6delda. Vastav n\u00e4ide on selle materjali l\u00f5pus. Statistikaandmeid v\u00f5ib alla laadida erinevatelt saitidelt, n\u00e4iteks <a class=\"urllink\" href=\"http:\/\/stat.ee\" target=\"_blank\" rel=\"noopener noreferrer\">www.stat.ee<\/a>, <a class=\"urllink\" href=\"http:\/\/haridussilm.ee\" target=\"_blank\" rel=\"noopener noreferrer\">haridussilm.ee<\/a>, <a class=\"urllink\" href=\"http:\/\/ec.europa.eu\/eurostat\" target=\"_blank\" rel=\"noopener noreferrer\">ec.europa.eu\/eurostat<\/a>.<\/p>\r\nSeda, kuidas Pythoni programmiga andmeid faili kirjutada, vaatame tulevikus.\r\n<h2>Pangaautomaat rahvusvaheliseks<\/h2>\r\n<p class=\"vspace\">Failidest andmete lugemisega saame t\u00e4iendada pangaautomaadi programmi nii, et saaks keelt valida.<\/p>\r\n<p class=\"vspace\">Programmi t\u00f6\u00f6ks vajalikud failid on <a class=\"urllink\" href=\"https:\/\/courses.cs.ut.ee\/2023\/eprogalused\/fall\/Main\/HomePage?action=download&amp;upname=est.txt&amp;disposition=attachment\" target=\"_blank\" rel=\"noopener noreferrer\">est.txt<\/a>, <a class=\"urllink\" href=\"https:\/\/courses.cs.ut.ee\/2023\/eprogalused\/fall\/Main\/HomePage?action=download&amp;upname=eng.txt&amp;disposition=attachment\" target=\"_blank\" rel=\"noopener noreferrer\">eng.txt<\/a> ja <a class=\"urllink\" href=\"https:\/\/courses.cs.ut.ee\/2023\/eprogalused\/fall\/Main\/HomePage?action=download&amp;upname=ger.txt&amp;disposition=attachment\" target=\"_blank\" rel=\"noopener noreferrer\">ger.txt<\/a>.<\/p>\r\n<strong>N\u00e4iteprogramm. Mitmekeelne pangaautomaat<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from time import sleep\r\n \r\nkeel = int(input(\"1) Eesti 2) English 3) Deutsche \"))\r\n \r\nif keel == 2:\r\n    failinimi = \"eng.txt\"\r\nelif keel == 3:\r\n    failinimi = \"ger.txt\"\r\nelse:\r\n    failinimi = \"est.txt\"\r\n \r\nreadfailist = open(failinimi, encoding = \"UTF-8\")\r\nread = []                                #ilma reavahetusteta ridade list\r\nfor rida in readfailist:                 #reakaupa listist readfailist\r\n        read = read + [rida.strip(\"\\n\")] #ilma reavahetuseta rida lisatakse listi\r\n        # v\u00f5i read.append(rida.strip(\"\\n\"))\r\nreadfailist.close() # faili ei l\u00e4he enam vaja\r\n \r\nsisestatud_pin = \"\"\r\nkatseid = 3\r\nwhile sisestatud_pin != \"1234\" and katseid &gt; 0:\r\n    print(read[0])\r\n    print(read[1] + str(katseid) + read[2])\r\n    katseid -= 1\r\n    sisestatud_pin = input()\r\nif sisestatud_pin == \"1234\":\r\n    print(read[3])\r\nelse:\r\n    print(read[4])\r\n    i = 10\r\n    while i &gt; 0:\r\n        print(i)\r\n        i -= 1\r\n        sleep(1)<\/pre>\r\nSelle programmi loomisest on ka <a href=\"https:\/\/youtu.be\/8tvtLbFfCLY\">video<\/a>.\r\n<h2>Kilpkonna translaator<\/h2>\r\nFaili sisu v\u00f5ib olla hoopis programmitekst. Tegelikult meie programmide tekstid ongi lihtsalt tekstifailid, mille j\u00e4rgi Thonny tegutseb.\r\n\r\nOlgu meil n\u00e4iteks failis kirjas, kuidas kilpkonn peaks liikuma:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">edasi 40\r\nparemale 90\r\nedasi 50\r\ntagasi 30\r\nvasakule 90\r\nedasi 30<\/pre>\r\n<p class=\"vspace\">Kirjutame sellise programmi, mis selle teksti kilpkonnale arusaadavaks t\u00f5lgib.<\/p>\r\n<strong>N\u00e4iteprogramm. Kilpkonna translaator<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import *\r\n \r\n# faili avamine\r\nfail = open(\"kilpkonn.txt\")\r\n# faili t\u00f6\u00f6tlemine ja kilpkonnaga joonistamine\r\nfor rida in fail:\r\n    osad = rida.split()  # t\u00fchikute kohal osadeks\r\n    liikumine = osad[0]  # kuidas liikuda\r\n    arv = int(osad[1])   # kui palju\r\n    if liikumine == \"vasakule\":\r\n        left(arv)\r\n    elif liikumine == \"paremale\":\r\n        right(arv)\r\n    elif liikumine == \"edasi\":\r\n        forward(arv)\r\n    elif liikumine == \"tagasi\":\r\n        backward(arv)\r\n    else:\r\n        print(\"Ei saa sellest k\u00e4sust aru!\")\r\n \r\nfail.close()\r\nexitonclick()<\/pre>\r\nN\u00e4eme, et kilpkonn saigi selle programmi vahendusel eestikeelsetest k\u00e4skudest aru. J\u00e4relikult meie programm t\u00f5lgib (inglise keeles <em>translating<\/em>). Selliseid programme, mis programmiteksti arvutile arusaadavaks teevad, nimetatakse <em>translaatoriteks<\/em>.\r\n<h2>Andmed avalikust andmebaasist. csv-vorming<\/h2>\r\n<p class=\"vspace\">Eespool mainisime avalikke andmebaase. N\u00e4iteks statistikaameti kodulehel <a class=\"urllink\" href=\"http:\/\/stat.ee\" target=\"_blank\" rel=\"noopener noreferrer\">stat.ee<\/a> saab statistika andmebaasist pakutavad andmed v\u00e4lja valida ja sobivas vormingus salvestada. Kuigi valikus on ka <em>tekstifail (.txt)<\/em>, on meile siin sobivam <em>tabeldieraldusega pealkirjata tekst (.csv)<\/em> v\u00f5i <em>semikooloneraldusega pealkirjata tekst (.csv)<\/em>. M\u00f5lemal juhul antakse meile <em>csv<\/em>-fail. Vormingunimi csv on l\u00fchend s\u00f5nadest <em>comma-separated values<\/em> (komaga eraldatud v\u00e4\u00e4rtused). Kuigi vahel kasutataksegi v\u00e4\u00e4rtuste eraldajana koma, siis paljudel juhtudel on eraldajaks hoopis tabeldusm\u00e4rk (Pythonis \"\\t\") v\u00f5i semikoolon.<\/p>\r\n<p class=\"vspace\">N\u00e4iteks v\u00f5ib rida failis <a class=\"urllink\" href=\"https:\/\/courses.cs.ut.ee\/2023\/eprogalused\/fall\/Main\/HomePage?action=download&amp;upname=RV031sm.csv&amp;disposition=attachment\" target=\"_blank\" rel=\"noopener noreferrer\">RV031sm.csv<\/a> olla selline (loomulik iive 1923. aastal): <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\"1923\";3636<\/code><\/p>\r\n<p class=\"vspace\">N\u00fc\u00fcd on vaja see rida semikooloni kohalt osadeks jaotada ja osad t\u00e4isarvudena esitada. Osadeks saab jaotada funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">split<\/code> abil, mis tekitab antud juhul kahe elemendiga s\u00f5nej\u00e4rjendi. \u00dcks element on s\u00f5ne <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">'\"1923\"'<\/code> ja teine <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">'3636'<\/code>. Tegelikult tahame m\u00f5lemal juhul saada t\u00e4isarve. Kuna esimesel juhul on s\u00f5nes endas jutum\u00e4rgid, siis tuleb need eemaldada n\u00e4iteks funktsiooni <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">strip<\/code><\/code> abil.<\/p>\r\n<strong>N\u00e4iteprogramm. <em>csv<\/em>-faili lugemine<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">readfailist = open(\"RV031sm.csv\")\r\naastad = []                              # j\u00e4rjend aastate jaoks\r\niibed = []                               # j\u00e4rjend iivete jaoks\r\nfor rida in readfailist:                 # reakaupa listist readfailist\r\n    realt = rida.split(';')              # jaotada semikooloni kohalt\r\n    aastad += [int(realt[0].strip('\"'))] # aastate j\u00e4rjendisse juurde\r\n    # v\u00f5i aastad.append(int(realt[0].strip('\"')))\r\n    iibed += [int(realt[1])]             # iivete j\u00e4rjendisse juurde\r\n    # v\u00f5i iibed.append(int(realt[1]))\r\nreadfailist.close()                      # faili ei l\u00e4he enam vaja\r\nprint(aastad)\r\nprint(iibed)<\/pre>\r\nSelle programmi loomisest on ka <a href=\"https:\/\/youtu.be\/IrY19oHMyjM\">video<\/a>.\r\n\r\nPalun kommenteeri seda materjali <a href=\"https:\/\/docs.google.com\/forms\/d\/e\/1FAIpQLSfyBeRS1JaxmKx9tfngptOJ3_e6cosbSwQSMbLrwzCtMi3oug\/viewform\" target=\"_blank\" rel=\"noopener noreferrer\">Google'i k\u00fcsimustikus<\/a>.","rendered":"<p>Selles peat\u00fckis vaatleme programmi abil failist andmete lugemist. R\u00e4\u00e4gime tekstifailist, <em>csv<\/em>-failivormingust ning translaatoritest.<\/p>\n<h2>Andmed failist<\/h2>\n<p><em>For<\/em>-ts\u00fcklit saame kasutada failist andmete lugemiseks. Selline v\u00f5imalus annab programmidele uue m\u00f5\u00f5tme &#8211; enam ei pea andmeid programmi sisse kirjutama v\u00f5i kasutajalt sisestamist k\u00fcsima. Meie piirdume esialgu selliste failidega, mis on ka inimesele loetavad ja arusaadavad. Kasutame lihtsaid tekstifaile, mis koosnevad ridadest.<\/p>\n<p><strong>N\u00e4iteprogramm. Faili &#8220;andmed.txt&#8221; lugemine<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">fail = open(\"andmed.txt\", encoding=\"UTF-8\")\r\nfor rida in fail:\r\n    print(\"Lugesin sellise rea: \" + rida)\r\nfail.close()<\/pre>\n<p>Andmed loetakse failist <em>andmed.txt<\/em>, mis on programmiga samas kaustas. Faili avamisel oleks v\u00f5inud kasutada \u00fche argumendiga varianti <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">open(\"andmed.txt\")<\/code>, aga kuna meil v\u00f5ib tulla tegemist t\u00e4pit\u00e4htedega, t\u00e4psustame kodeeringu argumendiga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">encoding=\"UTF-8\"<\/code>.<\/p>\n<p class=\"vspace\">Faili read saame k\u00e4tte <em>for<\/em>-ts\u00fckliga. Muutujas <code>fail<\/code> on k\u00fcll m\u00f5nev\u00f5rra keerukam struktuur, aga <em>for<\/em>-ts\u00fckkel oskab sellest \u00fckshaaval ridu lugeda. Ts\u00fckli kehas saame konkreetse reaga midagi peale hakata, antud juhul v\u00e4ljastame selle lihtsalt ekraanile.<\/p>\n<p class=\"vspace\">V\u00f5tame j\u00e4rgmise \u00fclesande. Olgu meil fail <a class=\"urllink\" href=\"https:\/\/courses.cs.ut.ee\/2023\/eprogalused\/fall\/Main\/HomePage?action=download&amp;upname=jooks.txt&amp;disposition=attachment\" target=\"_blank\" rel=\"noopener noreferrer\">jooks.txt<\/a>, kus on kirjas, mitu kilomeetrit tervisesportlane erinevatel kordadel jooksis. Teeme programmi, mis k\u00f5ik need arvud kokku liidab:<\/p>\n<p><strong>N\u00e4iteprogramm. Jooksudistantside summa<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\">fail = open(\"jooks.txt\", encoding=\"UTF-8\")\r\nkokku = 0\r\nfor rida in fail:\r\n    kokku += float(rida)\r\nfail.close()\r\nprint(\"Kokku joosti \" + str(kokku) + \" kilomeetrit.\")<\/pre>\n<p>Muidugi v\u00f5ib ts\u00fckli kehas ka rohkem ridu olla. N\u00e4iteks liidame kokku ainult need jooksud, mil joosti \u00fcle 10 kilomeetri.<\/p>\n<p><strong>N\u00e4iteprogramm. Pikkade jooksudistantside summa<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\">fail = open(\"jooks.txt\", encoding=\"UTF-8\")\r\nkokku = 0\r\nfor rida in fail:\r\n    kilomeetreid = float(rida)\r\n    if kilomeetreid &gt; 10:\r\n        kokku += kilomeetreid\r\nfail.close()\r\nprint(\"Kokku joosti pikki jookse \" + str(kokku) + \" kilomeetrit.\")<\/pre>\n<p>Kui me tahame andmetega midagi edasi teha, siis v\u00f5ib olla m\u00f5istlik panna need j\u00e4rjendisse.<\/p>\n<p><strong>N\u00e4iteprogramm. Jooksudistantside lugemine j\u00e4rjendisse<br \/>\n<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">fail = open(\"jooks.txt\", encoding=\"UTF-8\")\r\nkokku = 0\r\njooksud = []\r\nfor rida in fail:\r\n    jooksud.append(float(rida))\r\n    # teine variant: jooksud += [float(rida)]     \r\nfail.close()\r\nprint(jooksud[4])<\/pre>\n<p class=\"vspace\">Enne ts\u00fcklit on tehtud t\u00fchi j\u00e4rjend: <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">jooksud = []<\/code>. Ts\u00fckli igal sammul lisatakse j\u00e4rjendile realt loetud v\u00e4\u00e4rtus: <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">jooksud.append(float(rida))<\/code><\/code> v\u00f5i <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">jooksud += [float(rida)]<\/code>. P\u00e4rast ts\u00fcklit v\u00e4ljastatakse j\u00e4rjendi element, mille indeks on 4.<\/p>\n<p>PS! Vastavalt sellele, kas failis on ridadel t\u00e4isarvud v\u00f5i ujukomaarvud, peaks need j\u00e4rjendisse lisades teisendama vastavalt arvudeks kasutades funktsiooni <strong>int()<\/strong> v\u00f5i <strong>float()<\/strong>. K\u00fcll aga s\u00f5ne puhul oleks hea s\u00f5ne l\u00f5pust \u00e4ra v\u00f5tta reavahetus k\u00e4suga <strong>strip()<\/strong>.<\/p>\n<h2>Kuidas failid tekivad?<\/h2>\n<p class=\"vspace\">Faili, kust andmeid v\u00f5tta, v\u00f5ib tekitada erineval moel. Lihtsaim neist on fail tekstiredaktoriga kirjutada ja salvestada. Tekstiredaktoriga faili koostades peab j\u00e4lgima, et tegemist oleks n\u00f6 <em>plain<\/em>-tekstiga (nagu seda on <em>txt<\/em>-vormingus failid). Salvestamisel v\u00f5iks eelistada UTF-8 kodeeringut, muu kodeeringuga v\u00f5ib vaja minna programmis kodeeringu muutmist.<\/p>\n<p class=\"vspace\">Meil on v\u00f5imalik tekstiredaktorina kasutada Thonnyt ennast. Teksti salvestamisel tuleb valida salvestust\u00fc\u00fcbiks <em>text files<\/em>. Vaikimisi l\u00e4hevad need failid samasse kausta, kuhu programmidki.<\/p>\n<p class=\"vspace\">Tohutult palju v\u00f5imalusi pakuvad avalikud andmebaasid, kust saame sobiva tabeli alla laadida ja seda oma programmi abil t\u00f6\u00f6delda. Vastav n\u00e4ide on selle materjali l\u00f5pus. Statistikaandmeid v\u00f5ib alla laadida erinevatelt saitidelt, n\u00e4iteks <a class=\"urllink\" href=\"http:\/\/stat.ee\" target=\"_blank\" rel=\"noopener noreferrer\">www.stat.ee<\/a>, <a class=\"urllink\" href=\"http:\/\/haridussilm.ee\" target=\"_blank\" rel=\"noopener noreferrer\">haridussilm.ee<\/a>, <a class=\"urllink\" href=\"http:\/\/ec.europa.eu\/eurostat\" target=\"_blank\" rel=\"noopener noreferrer\">ec.europa.eu\/eurostat<\/a>.<\/p>\n<p>Seda, kuidas Pythoni programmiga andmeid faili kirjutada, vaatame tulevikus.<\/p>\n<h2>Pangaautomaat rahvusvaheliseks<\/h2>\n<p class=\"vspace\">Failidest andmete lugemisega saame t\u00e4iendada pangaautomaadi programmi nii, et saaks keelt valida.<\/p>\n<p class=\"vspace\">Programmi t\u00f6\u00f6ks vajalikud failid on <a class=\"urllink\" href=\"https:\/\/courses.cs.ut.ee\/2023\/eprogalused\/fall\/Main\/HomePage?action=download&amp;upname=est.txt&amp;disposition=attachment\" target=\"_blank\" rel=\"noopener noreferrer\">est.txt<\/a>, <a class=\"urllink\" href=\"https:\/\/courses.cs.ut.ee\/2023\/eprogalused\/fall\/Main\/HomePage?action=download&amp;upname=eng.txt&amp;disposition=attachment\" target=\"_blank\" rel=\"noopener noreferrer\">eng.txt<\/a> ja <a class=\"urllink\" href=\"https:\/\/courses.cs.ut.ee\/2023\/eprogalused\/fall\/Main\/HomePage?action=download&amp;upname=ger.txt&amp;disposition=attachment\" target=\"_blank\" rel=\"noopener noreferrer\">ger.txt<\/a>.<\/p>\n<p><strong>N\u00e4iteprogramm. Mitmekeelne pangaautomaat<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from time import sleep\r\n \r\nkeel = int(input(\"1) Eesti 2) English 3) Deutsche \"))\r\n \r\nif keel == 2:\r\n    failinimi = \"eng.txt\"\r\nelif keel == 3:\r\n    failinimi = \"ger.txt\"\r\nelse:\r\n    failinimi = \"est.txt\"\r\n \r\nreadfailist = open(failinimi, encoding = \"UTF-8\")\r\nread = []                                #ilma reavahetusteta ridade list\r\nfor rida in readfailist:                 #reakaupa listist readfailist\r\n        read = read + [rida.strip(\"\\n\")] #ilma reavahetuseta rida lisatakse listi\r\n        # v\u00f5i read.append(rida.strip(\"\\n\"))\r\nreadfailist.close() # faili ei l\u00e4he enam vaja\r\n \r\nsisestatud_pin = \"\"\r\nkatseid = 3\r\nwhile sisestatud_pin != \"1234\" and katseid &gt; 0:\r\n    print(read[0])\r\n    print(read[1] + str(katseid) + read[2])\r\n    katseid -= 1\r\n    sisestatud_pin = input()\r\nif sisestatud_pin == \"1234\":\r\n    print(read[3])\r\nelse:\r\n    print(read[4])\r\n    i = 10\r\n    while i &gt; 0:\r\n        print(i)\r\n        i -= 1\r\n        sleep(1)<\/pre>\n<p>Selle programmi loomisest on ka <a href=\"https:\/\/youtu.be\/8tvtLbFfCLY\">video<\/a>.<\/p>\n<h2>Kilpkonna translaator<\/h2>\n<p>Faili sisu v\u00f5ib olla hoopis programmitekst. Tegelikult meie programmide tekstid ongi lihtsalt tekstifailid, mille j\u00e4rgi Thonny tegutseb.<\/p>\n<p>Olgu meil n\u00e4iteks failis kirjas, kuidas kilpkonn peaks liikuma:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">edasi 40\r\nparemale 90\r\nedasi 50\r\ntagasi 30\r\nvasakule 90\r\nedasi 30<\/pre>\n<p class=\"vspace\">Kirjutame sellise programmi, mis selle teksti kilpkonnale arusaadavaks t\u00f5lgib.<\/p>\n<p><strong>N\u00e4iteprogramm. Kilpkonna translaator<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import *\r\n \r\n# faili avamine\r\nfail = open(\"kilpkonn.txt\")\r\n# faili t\u00f6\u00f6tlemine ja kilpkonnaga joonistamine\r\nfor rida in fail:\r\n    osad = rida.split()  # t\u00fchikute kohal osadeks\r\n    liikumine = osad[0]  # kuidas liikuda\r\n    arv = int(osad[1])   # kui palju\r\n    if liikumine == \"vasakule\":\r\n        left(arv)\r\n    elif liikumine == \"paremale\":\r\n        right(arv)\r\n    elif liikumine == \"edasi\":\r\n        forward(arv)\r\n    elif liikumine == \"tagasi\":\r\n        backward(arv)\r\n    else:\r\n        print(\"Ei saa sellest k\u00e4sust aru!\")\r\n \r\nfail.close()\r\nexitonclick()<\/pre>\n<p>N\u00e4eme, et kilpkonn saigi selle programmi vahendusel eestikeelsetest k\u00e4skudest aru. J\u00e4relikult meie programm t\u00f5lgib (inglise keeles <em>translating<\/em>). Selliseid programme, mis programmiteksti arvutile arusaadavaks teevad, nimetatakse <em>translaatoriteks<\/em>.<\/p>\n<h2>Andmed avalikust andmebaasist. csv-vorming<\/h2>\n<p class=\"vspace\">Eespool mainisime avalikke andmebaase. N\u00e4iteks statistikaameti kodulehel <a class=\"urllink\" href=\"http:\/\/stat.ee\" target=\"_blank\" rel=\"noopener noreferrer\">stat.ee<\/a> saab statistika andmebaasist pakutavad andmed v\u00e4lja valida ja sobivas vormingus salvestada. Kuigi valikus on ka <em>tekstifail (.txt)<\/em>, on meile siin sobivam <em>tabeldieraldusega pealkirjata tekst (.csv)<\/em> v\u00f5i <em>semikooloneraldusega pealkirjata tekst (.csv)<\/em>. M\u00f5lemal juhul antakse meile <em>csv<\/em>-fail. Vormingunimi csv on l\u00fchend s\u00f5nadest <em>comma-separated values<\/em> (komaga eraldatud v\u00e4\u00e4rtused). Kuigi vahel kasutataksegi v\u00e4\u00e4rtuste eraldajana koma, siis paljudel juhtudel on eraldajaks hoopis tabeldusm\u00e4rk (Pythonis &#8220;\\t&#8221;) v\u00f5i semikoolon.<\/p>\n<p class=\"vspace\">N\u00e4iteks v\u00f5ib rida failis <a class=\"urllink\" href=\"https:\/\/courses.cs.ut.ee\/2023\/eprogalused\/fall\/Main\/HomePage?action=download&amp;upname=RV031sm.csv&amp;disposition=attachment\" target=\"_blank\" rel=\"noopener noreferrer\">RV031sm.csv<\/a> olla selline (loomulik iive 1923. aastal): <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\"1923\";3636<\/code><\/p>\n<p class=\"vspace\">N\u00fc\u00fcd on vaja see rida semikooloni kohalt osadeks jaotada ja osad t\u00e4isarvudena esitada. Osadeks saab jaotada funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">split<\/code> abil, mis tekitab antud juhul kahe elemendiga s\u00f5nej\u00e4rjendi. \u00dcks element on s\u00f5ne <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">'\"1923\"'<\/code> ja teine <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">'3636'<\/code>. Tegelikult tahame m\u00f5lemal juhul saada t\u00e4isarve. Kuna esimesel juhul on s\u00f5nes endas jutum\u00e4rgid, siis tuleb need eemaldada n\u00e4iteks funktsiooni <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">strip<\/code><\/code> abil.<\/p>\n<p><strong>N\u00e4iteprogramm. <em>csv<\/em>-faili lugemine<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">readfailist = open(\"RV031sm.csv\")\r\naastad = []                              # j\u00e4rjend aastate jaoks\r\niibed = []                               # j\u00e4rjend iivete jaoks\r\nfor rida in readfailist:                 # reakaupa listist readfailist\r\n    realt = rida.split(';')              # jaotada semikooloni kohalt\r\n    aastad += [int(realt[0].strip('\"'))] # aastate j\u00e4rjendisse juurde\r\n    # v\u00f5i aastad.append(int(realt[0].strip('\"')))\r\n    iibed += [int(realt[1])]             # iivete j\u00e4rjendisse juurde\r\n    # v\u00f5i iibed.append(int(realt[1]))\r\nreadfailist.close()                      # faili ei l\u00e4he enam vaja\r\nprint(aastad)\r\nprint(iibed)<\/pre>\n<p>Selle programmi loomisest on ka <a href=\"https:\/\/youtu.be\/IrY19oHMyjM\">video<\/a>.<\/p>\n<p>Palun kommenteeri seda materjali <a href=\"https:\/\/docs.google.com\/forms\/d\/e\/1FAIpQLSfyBeRS1JaxmKx9tfngptOJ3_e6cosbSwQSMbLrwzCtMi3oug\/viewform\" target=\"_blank\" rel=\"noopener noreferrer\">Google&#8217;i k\u00fcsimustikus<\/a>.<\/p>\n","protected":false},"author":12,"menu_order":3,"template":"","meta":{"pb_show_title":"on","pb_short_title":"","pb_subtitle":"","pb_authors":[],"pb_section_license":""},"chapter-type":[],"contributor":[],"license":[],"class_list":["post-148","chapter","type-chapter","status-publish","hentry"],"part":127,"_links":{"self":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/148","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters"}],"about":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/types\/chapter"}],"author":[{"embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/users\/12"}],"version-history":[{"count":17,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/148\/revisions"}],"predecessor-version":[{"id":615,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/148\/revisions\/615"}],"part":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/parts\/127"}],"metadata":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/148\/metadata\/"}],"wp:attachment":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/media?parent=148"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapter-type?post=148"},{"taxonomy":"contributor","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/contributor?post=148"},{"taxonomy":"license","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/license?post=148"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}