{"id":238,"date":"2019-01-15T11:41:17","date_gmt":"2019-01-15T11:41:17","guid":{"rendered":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/?post_type=chapter&#038;p=238"},"modified":"2023-12-13T10:58:00","modified_gmt":"2023-12-13T10:58:00","slug":"lugemine-failist","status":"publish","type":"chapter","link":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/chapter\/lugemine-failist\/","title":{"raw":"Lugemine failist","rendered":"Lugemine failist"},"content":{"raw":"<h2>Lugemine failist. T\u00f5de ja \u00f5igus<\/h2>\r\nFailist lugemist <em>for<\/em>-ts\u00fckli abil oleme varem mitmel korral kasutanud:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">fail = open(\"andmed.txt\", encoding=\"UTF-8\")\r\nfor rida in fail:\r\n    print(\"Lugesin sellise rea: \" + rida)\r\nfail.close()<\/pre>\r\n<p class=\"vspace\">Pikema teksti lugemise ja anal\u00fc\u00fcsimise n\u00e4itena v\u00f5tame k\u00e4sile Anton Hansen Tammsaare \"T\u00f5e ja \u00f5iguse\" 1. k\u00f6ite. Tegemist on meie rahva \u00fche t\u00fcvitekstiga, mida siin omalaadselt k\u00e4sitleme. Valdur Mikita on <a class=\"urllink\" href=\"http:\/\/www.sirp.ee\/s1-artiklid\/c7-kirjandus\/mikroetnos\/\" target=\"_blank\" rel=\"noopener\">Sirbis<\/a> kirjutanud: \"Rahvas, kelle k\u00f5ige kuulsam kirjandusteos on viiek\u00f6iteline sookuivendamise k\u00e4siraamat, ei saa olla normaalne \u2013 ja ei peagi. V\u00f5imalik, et meil on ilmaruumis hoopis \u00fcks teine asi ajada.\"<\/p>\r\n<p class=\"vspace\">K\u00f5igepealt tuleb tekst arvutisse laadida <a class=\"urllink\" href=\"https:\/\/courses.cs.ut.ee\/2023\/eprogalused\/fall\/Main\/HomePage?action=download&amp;upname=anton_hansen_tammsaare_tode_ja_oigus_i.txt&amp;disposition=attachment\" target=\"_blank\" rel=\"noopener\">siit<\/a>. (Kes tahab, v\u00f5ib proovida ka programselt veebist lugemist.)<\/p>\r\n<p class=\"vspace\">J\u00e4rgmine programm loendab, mitu korda on tekstis s\u00f5na \"t\u00f5de\" ja mitu korda \"\u00f5igus\".<\/p>\r\n<strong>N\u00e4iteprogramm. T\u00f5ed ja \u00f5igused<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">f = open(\"anton_hansen_tammsaare_tode_ja_oigus_i.txt\", encoding='UTF-8')\r\n \r\nt\u00f5de = 0   # loendaja\r\n\u00f5igus = 0  # loendaja\r\n \r\nfor rida in f:           # ridade kaupa\r\n    s\u00f5nad = rida.split() # rea s\u00f5nad j\u00e4rjendisse\r\n    for s in s\u00f5nad:      # s\u00f5nade kaupa\r\n        if s == \"t\u00f5de\":\r\n            t\u00f5de += 1\r\n        if s == \"\u00f5igus\":\r\n            \u00f5igus += 1\r\n \r\nprint(\"Failis s\u00f5na 't\u00f5de' on\", t\u00f5de,  \"korda.\")\r\nprint(\"Failis s\u00f5na '\u00f5igus' on\", \u00f5igus, \"korda.\")\r\n \r\nf.close()<\/pre>\r\n<h3>Enesekontroll (1 k\u00fcsimus)<\/h3>\r\n<code>[h5p id=\"39\"]<\/code>\r\n<h3>S\u00f5neotsingu t\u00e4iendamine<\/h3>\r\n<p class=\"vspace\">See programm leidis s\u00f5nade \"t\u00f5de\" ja \"\u00f5igus\" arvud ainult juhul, kei neile ei j\u00e4rge teisi s\u00fcmboleid. Kui tahame, et arvesse tuleksid ka need juhud, kus vahetult s\u00f5na j\u00e4rel on mingi kindel kirjavahem\u00e4rk, siis saame kasutada j\u00e4rgmisi v\u00f5rdlusi. Nii v\u00f5etakse arvesse need juhud, kus s\u00f5na j\u00e4rel on punkt, koma v\u00f5i k\u00fcsim\u00e4rk:<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">if s.strip(\".,?\") == \"t\u00f5de\":\r\n    t\u00f5de += 1\r\nif s.strip(\".,?\") == \"\u00f5igus\":\r\n    \u00f5igus += 1<\/pre>\r\n<p class=\"vspace\">N\u00fc\u00fcd vaatame varianti, kus kontrollitakse, kas s\u00f5na \"t\u00f5de\" (\"\u00f5igus\") sisaldub vaadeldavas s\u00f5nes:<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">if \"t\u00f5de\" in s:\r\n    t\u00f5de += 1\r\nif \"\u00f5igus\" in s:\r\n    \u00f5igus += 1<\/pre>\r\n<p class=\"vspace\">Kui tahame suurte t\u00e4htedega variante arvesse v\u00f5tta, siis saame seda teha nii:<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">if \"t\u00f5de\" in s.lower():\r\n    t\u00f5de += 1\r\nif \"\u00f5igus\" in s.lower():\r\n    \u00f5igus += 1<\/pre>\r\nSee lahendus leiab ka nn valepositiivseid vastuseid, n\u00e4iteks s\u00f5na \"t\u00f5de\" sisaldub s\u00f5nas \"t\u00f5demus\", mis on hoopis erineva t\u00e4hendusega. Inimkeelsete tekstide p\u00f5hjalikum automaatne t\u00f6\u00f6tlemine on k\u00fcllaltki keerukas ja siinsetes materjalides me seda ei vaatle.\r\n<h2>Veel failist lugemisest. Funktsioon <em>readline<\/em><\/h2>\r\n<p class=\"vspace\">Vaatleme veel m\u00f5ningaid v\u00f5imalusi, kuidas failidest andmeid k\u00e4tte saada. Alustame funktsiooniga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">readline<\/code>, mis v\u00f5tab failist j\u00e4rgmise rea.<\/p>\r\n<p class=\"vspace\">Esialgu teeme k\u00e4sitsi faili <em>andmed2.txt<\/em>. Esimesel real on inimese nimi, teisel real vanus (t\u00e4isarvuna) ning kolmandal real meiliaadress. Fail peab olema <em>plain-text<\/em> kujul (laiendiga <em>.txt<\/em>).<\/p>\r\n<strong>N\u00e4iteprogramm. Faili lugemine <em>readline<\/em> abil<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">f = open(\"andmed2.txt\", encoding=\"UTF-8\")\r\n \r\nnimi = f.readline()\r\nvanus = f.readline()\r\naadress = f.readline()\r\n \r\nprint(\"Nimi:\", nimi)\r\nprint(\"Vanus:\", vanus, \"aastat\")\r\nprint(\"Aadress:\", aadress)\r\n \r\nf.close()<\/pre>\r\nK\u00e4sk <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">open<\/code> otsib failis\u00fcsteemist \u00fcles soovitud faili ja tagastab viite sellele (antud n\u00e4ites salvestasime selle viite muutujasse <code>f<\/code>, mis on levinud nimi failide t\u00e4histamiseks). Kui tahame avada faili samast kaustast, kus asub programm, siis piisab vaid failinimest koos laiendiga: <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">f = open('andmed2.txt')<\/code>. Selleks, et t\u00e4pit\u00e4hed \u00f5igesti paistaksid, t\u00e4psustame kodeeringut argumendiga <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">encoding=\"UTF-8\"<\/code><\/code>.\r\n\r\nRida <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">nimi = f.readline()<\/code><\/code> loeb failist \u00fche rea, milles on meie n\u00e4ites isiku nimi, ning annab selle v\u00e4\u00e4rtuse muutujale <code>nimi<\/code>. J\u00e4rgmisel korral sama k\u00e4sku kasutades loetakse j\u00e4rgmine rida - meie n\u00e4ites vanus.\r\n\r\nK\u00e4sk <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">f.close()<\/code> paneb faili kinni. Faili sulgemata j\u00e4tmine v\u00f5ib p\u00f5hjustada igasuguseid muresid, n\u00e4iteks v\u00f5ib korduvatel k\u00e4ivitustel olla probleeme juba avatud faili avamisega.\r\n\r\nProgrammi t\u00f6\u00f6le pannes n\u00e4eme, et v\u00e4ljundis tekib \u00fcleliigseid t\u00fchje ridu. Nimelt j\u00e4etakse iga rea l\u00f5ppu alles ka failist p\u00e4rinev reavahetuse s\u00fcmbol. Kuna <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print<\/code> lisab omalt poolt veel \u00fche reavahetuse, siis saamegi neid liigselt. Liigse reavahetuse eemaldamiseks saame kasutada n\u00e4iteks meetodit\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">strip<\/code>, mis ilma argumente m\u00e4\u00e4ramata eemaldab <em>whitespace<\/em>-s\u00fcmbolid (t\u00fchikud, reavahetused jms):\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">nimi = f.readline().strip()<\/pre>\r\n<h2>Funktsioonid <em>readlines<\/em> ja <em>read<\/em><\/h2>\r\n<p class=\"vspace\">Lisaks funktsioonile <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">readline<\/code> saab failist info k\u00e4tte ka funktsiooniga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">readlines<\/code>:<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">f = open(\"andmed2.txt\", encoding=\"UTF-8\")\r\nloetud = f.readlines()\r\nf.close() # faili ei l\u00e4he enam vaja\r\nprint(loetud)<\/pre>\r\n<p class=\"vspace\">N\u00e4eme, et muutujas <code>loetud<\/code> on list, mille iga element on \u00fcks rida n\u00e4idatud failist.<\/p>\r\n<p class=\"vspace\">Veebist lugemisel kasutasime funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">read<\/code>. Seda saame kasutada ka failist lugemise korral. Nii saame kogu faili sisu \u00fche s\u00f5nena:<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">f = open(\"andmed2.txt\", encoding=\"UTF-8\")\r\nloetud = f.read()\r\nf.close() # faili ei l\u00e4he enam vaja\r\nprint(loetud)<\/pre>\r\nV\u00f5ime piirata loetavate m\u00e4rkide arvu (n\u00e4iteks 5 s\u00fcmbolit):\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">f = open(\"andmed2.txt\", encoding=\"UTF-8\")\r\nloetud = f.read(5)\r\nf.close() # faili ei l\u00e4he enam vaja\r\nprint(loetud)<\/pre>\r\n<p class=\"vspace\">Etteantud m\u00e4rkide arv v\u00f5ib olla ka \u00fcks, siis loetakse m\u00e4rke \u00fchekaupa.<\/p>\r\n<p class=\"vspace\">J\u00e4rgmine programm on inspireeritud asjaolust, et SMSi saatmisel on \u00f5-t\u00e4hte sisaldava s\u00f5numi maksimaalne lubatud pikkus m\u00e4rgatavalt v\u00e4iksem, sest siis kasutatakse teistsugust kodeeringut. Sageli asendatakse t\u00e4ht \u00f5 numbriga 6 (arvatavalt p\u00e4rineb traditsioon vanade mobiiltelefonide ajast, kus \u00f5-t\u00e4ht \u00fcldse puudus). Teeme programmi, mis asendaks k\u00f5ik <em>\u00f5<\/em>-t\u00e4hed s\u00fcmboliga <em>6<\/em>:<\/p>\r\n<strong>N\u00e4iteprogramm. \u00d5 asendamine I<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">f = open(\"sms.txt\", encoding=\"UTF-8\")\r\n \r\nwhile True:                     # l\u00f5pmatu ts\u00fckkel, kui ei katkestata\r\n    s\u00fcmbol = f.read(1)          # loetakse \u00fcks s\u00fcmbol\r\n    if s\u00fcmbol == \"\":            # kui enam s\u00fcmboleid pole\r\n        break                   # ts\u00fckkel katkestatakse\r\n    if s\u00fcmbol == \"\u00f5\":\r\n        print(\"6\", end = \"\")    # reavahetust ei tule\r\n    else:\r\n        print(s\u00fcmbol, end = \"\") # reavahetust ei tule\r\n \r\nf.close()                       # faili ei l\u00e4he enam vaja<\/pre>\r\nSama \u00fclesande saab lahendada ka kahe <em>for<\/em>-ts\u00fckliga. V\u00e4limine ts\u00fckkel tegutseb ridade kaupa. Sisemisel v\u00f5etakse vastavast reast s\u00fcmboleid:\r\n\r\n<strong>N\u00e4iteprogramm. \u00d5 asendamine II<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">f = open(\"sms.txt\", encoding=\"UTF-8\")\r\n \r\nfor rida in f:                      # ridade kaupa\r\n    for s\u00fcmbol in rida:             # s\u00fcmbolite kaupa\r\n        if s\u00fcmbol == \"\u00f5\":\r\n            print(\"6\", end = \"\")    # reavahetust ei tule\r\n        else:\r\n            print(s\u00fcmbol, end = \"\") # reavahetust ei tule\r\n \r\nf.close()                           # faili ei l\u00e4he enam vaja<\/pre>\r\nToome ka kolmanda variandi, kus funktsiooni <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">read<\/code><\/code> kasutades saame faili kogu sisu \u00fche s\u00f5nena k\u00e4sitleda. Selles s\u00f5nes muudame funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">replace<\/code> abil k\u00f5ik t\u00e4hed <em>\u00f5<\/em> numbriteks <em>6<\/em>:\r\n\r\n<strong>N\u00e4iteprogramm. \u00d5 asendamine III<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">f = open(\"sms.txt\", encoding=\"UTF-8\")\r\n \r\nfailisisu = f.read()\r\n \r\nasendatud\u00f5 = failisisu.replace(\"\u00f5\",\"6\")\r\n \r\nprint(asendatud\u00f5)\r\n \r\nf.close()<\/pre>\r\n<h3>Enesekontroll (1 \u00fclesanne)<\/h3>\r\n<code>[h5p id=\"40\"]<\/code>","rendered":"<h2>Lugemine failist. T\u00f5de ja \u00f5igus<\/h2>\n<p>Failist lugemist <em>for<\/em>-ts\u00fckli abil oleme varem mitmel korral kasutanud:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">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 class=\"vspace\">Pikema teksti lugemise ja anal\u00fc\u00fcsimise n\u00e4itena v\u00f5tame k\u00e4sile Anton Hansen Tammsaare &#8220;T\u00f5e ja \u00f5iguse&#8221; 1. k\u00f6ite. Tegemist on meie rahva \u00fche t\u00fcvitekstiga, mida siin omalaadselt k\u00e4sitleme. Valdur Mikita on <a class=\"urllink\" href=\"http:\/\/www.sirp.ee\/s1-artiklid\/c7-kirjandus\/mikroetnos\/\" target=\"_blank\" rel=\"noopener\">Sirbis<\/a> kirjutanud: &#8220;Rahvas, kelle k\u00f5ige kuulsam kirjandusteos on viiek\u00f6iteline sookuivendamise k\u00e4siraamat, ei saa olla normaalne \u2013 ja ei peagi. V\u00f5imalik, et meil on ilmaruumis hoopis \u00fcks teine asi ajada.&#8221;<\/p>\n<p class=\"vspace\">K\u00f5igepealt tuleb tekst arvutisse laadida <a class=\"urllink\" href=\"https:\/\/courses.cs.ut.ee\/2023\/eprogalused\/fall\/Main\/HomePage?action=download&amp;upname=anton_hansen_tammsaare_tode_ja_oigus_i.txt&amp;disposition=attachment\" target=\"_blank\" rel=\"noopener\">siit<\/a>. (Kes tahab, v\u00f5ib proovida ka programselt veebist lugemist.)<\/p>\n<p class=\"vspace\">J\u00e4rgmine programm loendab, mitu korda on tekstis s\u00f5na &#8220;t\u00f5de&#8221; ja mitu korda &#8220;\u00f5igus&#8221;.<\/p>\n<p><strong>N\u00e4iteprogramm. T\u00f5ed ja \u00f5igused<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">f = open(\"anton_hansen_tammsaare_tode_ja_oigus_i.txt\", encoding='UTF-8')\r\n \r\nt\u00f5de = 0   # loendaja\r\n\u00f5igus = 0  # loendaja\r\n \r\nfor rida in f:           # ridade kaupa\r\n    s\u00f5nad = rida.split() # rea s\u00f5nad j\u00e4rjendisse\r\n    for s in s\u00f5nad:      # s\u00f5nade kaupa\r\n        if s == \"t\u00f5de\":\r\n            t\u00f5de += 1\r\n        if s == \"\u00f5igus\":\r\n            \u00f5igus += 1\r\n \r\nprint(\"Failis s\u00f5na 't\u00f5de' on\", t\u00f5de,  \"korda.\")\r\nprint(\"Failis s\u00f5na '\u00f5igus' on\", \u00f5igus, \"korda.\")\r\n \r\nf.close()<\/pre>\n<h3>Enesekontroll (1 k\u00fcsimus)<\/h3>\n<p><code><\/p>\n<div id=\"h5p-39\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-39\" class=\"h5p-iframe\" data-content-id=\"39\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"Andmevahetus-2-t\u00f5edja\u00f5igused\"><\/iframe><\/div>\n<\/div>\n<p><\/code><\/p>\n<h3>S\u00f5neotsingu t\u00e4iendamine<\/h3>\n<p class=\"vspace\">See programm leidis s\u00f5nade &#8220;t\u00f5de&#8221; ja &#8220;\u00f5igus&#8221; arvud ainult juhul, kei neile ei j\u00e4rge teisi s\u00fcmboleid. Kui tahame, et arvesse tuleksid ka need juhud, kus vahetult s\u00f5na j\u00e4rel on mingi kindel kirjavahem\u00e4rk, siis saame kasutada j\u00e4rgmisi v\u00f5rdlusi. Nii v\u00f5etakse arvesse need juhud, kus s\u00f5na j\u00e4rel on punkt, koma v\u00f5i k\u00fcsim\u00e4rk:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">if s.strip(\".,?\") == \"t\u00f5de\":\r\n    t\u00f5de += 1\r\nif s.strip(\".,?\") == \"\u00f5igus\":\r\n    \u00f5igus += 1<\/pre>\n<p class=\"vspace\">N\u00fc\u00fcd vaatame varianti, kus kontrollitakse, kas s\u00f5na &#8220;t\u00f5de&#8221; (&#8220;\u00f5igus&#8221;) sisaldub vaadeldavas s\u00f5nes:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">if \"t\u00f5de\" in s:\r\n    t\u00f5de += 1\r\nif \"\u00f5igus\" in s:\r\n    \u00f5igus += 1<\/pre>\n<p class=\"vspace\">Kui tahame suurte t\u00e4htedega variante arvesse v\u00f5tta, siis saame seda teha nii:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">if \"t\u00f5de\" in s.lower():\r\n    t\u00f5de += 1\r\nif \"\u00f5igus\" in s.lower():\r\n    \u00f5igus += 1<\/pre>\n<p>See lahendus leiab ka nn valepositiivseid vastuseid, n\u00e4iteks s\u00f5na &#8220;t\u00f5de&#8221; sisaldub s\u00f5nas &#8220;t\u00f5demus&#8221;, mis on hoopis erineva t\u00e4hendusega. Inimkeelsete tekstide p\u00f5hjalikum automaatne t\u00f6\u00f6tlemine on k\u00fcllaltki keerukas ja siinsetes materjalides me seda ei vaatle.<\/p>\n<h2>Veel failist lugemisest. Funktsioon <em>readline<\/em><\/h2>\n<p class=\"vspace\">Vaatleme veel m\u00f5ningaid v\u00f5imalusi, kuidas failidest andmeid k\u00e4tte saada. Alustame funktsiooniga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">readline<\/code>, mis v\u00f5tab failist j\u00e4rgmise rea.<\/p>\n<p class=\"vspace\">Esialgu teeme k\u00e4sitsi faili <em>andmed2.txt<\/em>. Esimesel real on inimese nimi, teisel real vanus (t\u00e4isarvuna) ning kolmandal real meiliaadress. Fail peab olema <em>plain-text<\/em> kujul (laiendiga <em>.txt<\/em>).<\/p>\n<p><strong>N\u00e4iteprogramm. Faili lugemine <em>readline<\/em> abil<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">f = open(\"andmed2.txt\", encoding=\"UTF-8\")\r\n \r\nnimi = f.readline()\r\nvanus = f.readline()\r\naadress = f.readline()\r\n \r\nprint(\"Nimi:\", nimi)\r\nprint(\"Vanus:\", vanus, \"aastat\")\r\nprint(\"Aadress:\", aadress)\r\n \r\nf.close()<\/pre>\n<p>K\u00e4sk <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">open<\/code> otsib failis\u00fcsteemist \u00fcles soovitud faili ja tagastab viite sellele (antud n\u00e4ites salvestasime selle viite muutujasse <code>f<\/code>, mis on levinud nimi failide t\u00e4histamiseks). Kui tahame avada faili samast kaustast, kus asub programm, siis piisab vaid failinimest koos laiendiga: <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">f = open('andmed2.txt')<\/code>. Selleks, et t\u00e4pit\u00e4hed \u00f5igesti paistaksid, t\u00e4psustame kodeeringut argumendiga <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">encoding=\"UTF-8\"<\/code><\/code>.<\/p>\n<p>Rida <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">nimi = f.readline()<\/code><\/code> loeb failist \u00fche rea, milles on meie n\u00e4ites isiku nimi, ning annab selle v\u00e4\u00e4rtuse muutujale <code>nimi<\/code>. J\u00e4rgmisel korral sama k\u00e4sku kasutades loetakse j\u00e4rgmine rida &#8211; meie n\u00e4ites vanus.<\/p>\n<p>K\u00e4sk <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">f.close()<\/code> paneb faili kinni. Faili sulgemata j\u00e4tmine v\u00f5ib p\u00f5hjustada igasuguseid muresid, n\u00e4iteks v\u00f5ib korduvatel k\u00e4ivitustel olla probleeme juba avatud faili avamisega.<\/p>\n<p>Programmi t\u00f6\u00f6le pannes n\u00e4eme, et v\u00e4ljundis tekib \u00fcleliigseid t\u00fchje ridu. Nimelt j\u00e4etakse iga rea l\u00f5ppu alles ka failist p\u00e4rinev reavahetuse s\u00fcmbol. Kuna <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print<\/code> lisab omalt poolt veel \u00fche reavahetuse, siis saamegi neid liigselt. Liigse reavahetuse eemaldamiseks saame kasutada n\u00e4iteks meetodit\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">strip<\/code>, mis ilma argumente m\u00e4\u00e4ramata eemaldab <em>whitespace<\/em>-s\u00fcmbolid (t\u00fchikud, reavahetused jms):<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">nimi = f.readline().strip()<\/pre>\n<h2>Funktsioonid <em>readlines<\/em> ja <em>read<\/em><\/h2>\n<p class=\"vspace\">Lisaks funktsioonile <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">readline<\/code> saab failist info k\u00e4tte ka funktsiooniga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">readlines<\/code>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">f = open(\"andmed2.txt\", encoding=\"UTF-8\")\r\nloetud = f.readlines()\r\nf.close() # faili ei l\u00e4he enam vaja\r\nprint(loetud)<\/pre>\n<p class=\"vspace\">N\u00e4eme, et muutujas <code>loetud<\/code> on list, mille iga element on \u00fcks rida n\u00e4idatud failist.<\/p>\n<p class=\"vspace\">Veebist lugemisel kasutasime funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">read<\/code>. Seda saame kasutada ka failist lugemise korral. Nii saame kogu faili sisu \u00fche s\u00f5nena:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">f = open(\"andmed2.txt\", encoding=\"UTF-8\")\r\nloetud = f.read()\r\nf.close() # faili ei l\u00e4he enam vaja\r\nprint(loetud)<\/pre>\n<p>V\u00f5ime piirata loetavate m\u00e4rkide arvu (n\u00e4iteks 5 s\u00fcmbolit):<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">f = open(\"andmed2.txt\", encoding=\"UTF-8\")\r\nloetud = f.read(5)\r\nf.close() # faili ei l\u00e4he enam vaja\r\nprint(loetud)<\/pre>\n<p class=\"vspace\">Etteantud m\u00e4rkide arv v\u00f5ib olla ka \u00fcks, siis loetakse m\u00e4rke \u00fchekaupa.<\/p>\n<p class=\"vspace\">J\u00e4rgmine programm on inspireeritud asjaolust, et SMSi saatmisel on \u00f5-t\u00e4hte sisaldava s\u00f5numi maksimaalne lubatud pikkus m\u00e4rgatavalt v\u00e4iksem, sest siis kasutatakse teistsugust kodeeringut. Sageli asendatakse t\u00e4ht \u00f5 numbriga 6 (arvatavalt p\u00e4rineb traditsioon vanade mobiiltelefonide ajast, kus \u00f5-t\u00e4ht \u00fcldse puudus). Teeme programmi, mis asendaks k\u00f5ik <em>\u00f5<\/em>-t\u00e4hed s\u00fcmboliga <em>6<\/em>:<\/p>\n<p><strong>N\u00e4iteprogramm. \u00d5 asendamine I<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">f = open(\"sms.txt\", encoding=\"UTF-8\")\r\n \r\nwhile True:                     # l\u00f5pmatu ts\u00fckkel, kui ei katkestata\r\n    s\u00fcmbol = f.read(1)          # loetakse \u00fcks s\u00fcmbol\r\n    if s\u00fcmbol == \"\":            # kui enam s\u00fcmboleid pole\r\n        break                   # ts\u00fckkel katkestatakse\r\n    if s\u00fcmbol == \"\u00f5\":\r\n        print(\"6\", end = \"\")    # reavahetust ei tule\r\n    else:\r\n        print(s\u00fcmbol, end = \"\") # reavahetust ei tule\r\n \r\nf.close()                       # faili ei l\u00e4he enam vaja<\/pre>\n<p>Sama \u00fclesande saab lahendada ka kahe <em>for<\/em>-ts\u00fckliga. V\u00e4limine ts\u00fckkel tegutseb ridade kaupa. Sisemisel v\u00f5etakse vastavast reast s\u00fcmboleid:<\/p>\n<p><strong>N\u00e4iteprogramm. \u00d5 asendamine II<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">f = open(\"sms.txt\", encoding=\"UTF-8\")\r\n \r\nfor rida in f:                      # ridade kaupa\r\n    for s\u00fcmbol in rida:             # s\u00fcmbolite kaupa\r\n        if s\u00fcmbol == \"\u00f5\":\r\n            print(\"6\", end = \"\")    # reavahetust ei tule\r\n        else:\r\n            print(s\u00fcmbol, end = \"\") # reavahetust ei tule\r\n \r\nf.close()                           # faili ei l\u00e4he enam vaja<\/pre>\n<p>Toome ka kolmanda variandi, kus funktsiooni <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">read<\/code><\/code> kasutades saame faili kogu sisu \u00fche s\u00f5nena k\u00e4sitleda. Selles s\u00f5nes muudame funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">replace<\/code> abil k\u00f5ik t\u00e4hed <em>\u00f5<\/em> numbriteks <em>6<\/em>:<\/p>\n<p><strong>N\u00e4iteprogramm. \u00d5 asendamine III<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">f = open(\"sms.txt\", encoding=\"UTF-8\")\r\n \r\nfailisisu = f.read()\r\n \r\nasendatud\u00f5 = failisisu.replace(\"\u00f5\",\"6\")\r\n \r\nprint(asendatud\u00f5)\r\n \r\nf.close()<\/pre>\n<h3>Enesekontroll (1 \u00fclesanne)<\/h3>\n<p><code><\/p>\n<div id=\"h5p-40\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-40\" class=\"h5p-iframe\" data-content-id=\"40\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"Andmevahetus-2-misilmub\"><\/iframe><\/div>\n<\/div>\n<p><\/code><\/p>\n","protected":false},"author":12,"menu_order":2,"template":"","meta":{"pb_show_title":"on","pb_short_title":"","pb_subtitle":"","pb_authors":[],"pb_section_license":""},"chapter-type":[],"contributor":[],"license":[],"class_list":["post-238","chapter","type-chapter","status-publish","hentry"],"part":233,"_links":{"self":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/238","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":5,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/238\/revisions"}],"predecessor-version":[{"id":570,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/238\/revisions\/570"}],"part":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/parts\/233"}],"metadata":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/238\/metadata\/"}],"wp:attachment":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/media?parent=238"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapter-type?post=238"},{"taxonomy":"contributor","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/contributor?post=238"},{"taxonomy":"license","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/license?post=238"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}