{"id":246,"date":"2019-01-16T12:49:24","date_gmt":"2019-01-16T12:49:24","guid":{"rendered":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/?post_type=chapter&#038;p=246"},"modified":"2025-12-12T11:49:05","modified_gmt":"2025-12-12T11:49:05","slug":"faili-kirjutamine","status":"publish","type":"chapter","link":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/chapter\/faili-kirjutamine\/","title":{"raw":"Faili kirjutamine","rendered":"Faili kirjutamine"},"content":{"raw":"<h3>T\u00fchja faili kirjutamine<\/h3>\r\n<p class=\"vspace\">Eespool oleme tutvunud mitmete v\u00f5imalustega, kuidas failist andmeid lugeda. Failid on meil juba olemas olnud v\u00f5i oleme need ise tekstiredaktoriga teinud. N\u00fc\u00fcd vaatame, kuidas isetehtud programmiga andmeid faili kirjutada. Selleks pakub v\u00f5imalusi funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">write<\/code> (ingl <em>kirjuta<\/em>).<\/p>\r\n<p class=\"vspace\">J\u00e4rgmine programm kirjutab kasutajalt k\u00fcsitud andmed faili.<\/p>\r\n<strong>N\u00e4iteprogramm. Faili kirjutamine I<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">nimi = input(\"Palun sisesta oma nimi: \")\r\nvanus = input(\"vanus: \")\r\naadress = input(\"aadress: \")\r\n \r\nf = open(\"andmed3.txt\", \"w\")\r\nf.write(nimi + \"\\n\")\r\nf.write(vanus + \"\\n\")\r\nf.write(aadress + \"\\n\")\r\nf.close()<\/pre>\r\n<p class=\"vspace\">Faili kirjutamiseks tuleb funktsioonile <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">open<\/code> anda ka teine argument v\u00e4\u00e4rtusega <code>\"w\"<\/code> (nagu <em>write<\/em>). Kui sellise nimega fail juba eksisteerib, siis <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">open(..., \"w\")<\/code> teeb selle t\u00fchjaks. Erinevalt funktsioonist <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print<\/code> ei tekita funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">write<\/code> automaatselt reavahetusi. Selleks, et saada andmeid eri ridadele, lisasime reavahetuse s\u00fcmboli k\u00e4sitsi.<\/p>\r\n<p class=\"vspace\">Proovime kirjutada programmi, mis k\u00fcsib kasutajalt kaks failinime. Esimene fail peaks olema juba olemas ja seal peaks olema mingi tekst. Teine fail v\u00f5iks olla uus. Programmi \u00fclesanne on v\u00f5tta esimese faili sisu, teisendada see suurt\u00e4htedesse ning kirjutada teise faili.<\/p>\r\n<strong>N\u00e4iteprogramm. \u00dchest failist teise \u00fcmberkirjutamine<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">doonorNimi = input(\"Mis failist info v\u00f5tta? \")\r\naktseptorNimi = input(\"Millisesse faili info pannakse? \")\r\ndoonorFail = open(doonorNimi, encoding=\"UTF-8\")\r\naktseptorFail = open(aktseptorNimi, \"w\")\r\nfor rida in doonorFail:\r\n    aktseptorFail.write(rida.upper())\r\ndoonorFail.close()\r\naktseptorFail.close()<\/pre>\r\n<p class=\"vspace\">Ka faili kirjutamiseks saab m\u00e4\u00e4rata kodeeringu, n\u00e4iteks <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">open(aktseptorNimi, \"w\", encoding=\"UTF-8\")<\/code>.<\/p>\r\n\r\n<h3>Failile juurde kirjutamine<\/h3>\r\n<p class=\"vspace\">Kui funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">open<\/code> teine argument on <code>\"a\"<\/code>, siis kirjutatakse olemasoleva faili l\u00f5pust edasi ning varasem sisu s\u00e4ilib muutmata. Kui sellist faili pole, siis see luuakse. Ka siin saab m\u00e4\u00e4rata kodeeringu, n\u00e4iteks <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">open(failiNimi, \"a\", encoding=\"UTF-8\")<\/code>. Argument <code>\"a\"<\/code> tuleb ingliskeelsest s\u00f5nast <em>append<\/em> (<em>lisa<\/em>).<\/p>\r\n\r\n<h3>Temperatuurid veebist faili<\/h3>\r\n<p class=\"vspace\">Kirjutame programmi, mis loeb aadressilt <a class=\"urllink\" href=\"http:\/\/meteo.physic.ut.ee\/\" target=\"_blank\" rel=\"noopener\">http:\/\/meteo.physic.ut.ee\/<\/a> aasta 2017 jaoks iga p\u00e4eva keskmise temperatuuri ja kirjutab selle faili. \u00dche aasta andmete t\u00f6\u00f6tlemine v\u00f5tab aega umbes pool minutit. Programmis kasutatakse kahekordset ts\u00fcklit, mille p\u00f5hjalikum k\u00e4sitlus j\u00e4\u00e4b siinsetest materjalidest v\u00e4lja.<\/p>\r\n<strong>N\u00e4iteprogramm. Temperatuurid veebist faili<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from urllib.request import urlopen\r\n \r\nfail = open(\"andmed.txt\", \"a\") # fail avatakse juurde kirjutamiseks\r\np\u00e4evad = [31,28,31,30,31,30,31,31,30,31,30,31]\r\naasta = 2017\r\n \r\nfor kuu in range(1,13): # v\u00e4limine ts\u00fckkel kuude j\u00e4rjenumbrite kaupa\r\n    for p\u00e4ev in range(1, p\u00e4evad[kuu-1]+1): # sisemine ts\u00fckkel p\u00e4evade kaupa\r\n        # konkreetse p\u00e4eva andmed\r\n        vastus = urlopen(\"http:\/\/meteo.physic.ut.ee\/et\/showperiod.php?type=setday&amp;year=\"+str(aasta)+\"&amp;month=\"+str(kuu)+\"&amp;day=\"+str(p\u00e4ev))\r\n        baidid = vastus.read()\r\n        tekst = baidid.decode()\r\n \r\n        otsitav = \"&lt;SMALL&gt;keskmine&lt;\/SMALL&gt;&lt;BR&gt;&lt;B&gt;\"\r\n        algus = tekst.index(otsitav) # leitakse \u00f5ige koht\r\n        temp_algus = algus + len(otsitav) # siit algab temperatuur\r\n        deg = tekst.index(\" &amp;deg;\") # siin l\u00f5peb\r\n        temp = tekst[temp_algus:deg] # viilutades leitakse temperatuur\r\n        # funktsioon rjust paneb \u00fchekohalisele p\u00e4eva ja kuu j\u00e4rjenumbrile 0 ette, et oleks kahekohaline. \r\n        fail.write(str(p\u00e4ev).rjust(2,\"0\")+\".\"+str(kuu).rjust(2,\"0\")+\".\"+str(aasta)+\": \"+str(temp)+\"\\n\")\r\n \r\n \r\nvastus.close()\r\nfail.close()<\/pre>\r\n<h3>Enesekontroll (1 k\u00fcsimus)<\/h3>\r\n<code>[h5p id=\"42\"]<\/code>\r\n<h3>\u0160ifreerimine<\/h3>\r\n<p class=\"vspace\">Tegeleme natuke salakirjadega. Me ei kirjuta faili mitte s\u00fcmboli enda, vaid mingi kindla teise s\u00fcmboli. N\u00e4iteks kui me kirjutame t\u00e4he <code>A<\/code> asemel t\u00e4hestikus 4 kohta edasi paikneva t\u00e4he E, siis s\u00f5ne <code>AEG<\/code> asemel kirjutaksime hoopis <code>EIK<\/code>. Sellise tegevuse nimetus on nihke\u0161iffer, mis on ajalooliselt tuntud meetod salakirja kirjutamiseks. Kui nihe on teada, siis on teksti lihtne isegi k\u00e4sitsi de\u0161ifreerida, arvutist r\u00e4\u00e4kimata. Ka tundmatu nihke korral on v\u00f5imalik \u0161iffer \u00fcsna kiiresti murda.<\/p>\r\n<p class=\"vspace\">Kuna me tahame t\u00e4hti j\u00e4rjekorranumbri alusel nihutada, siis oleks m\u00f5istlik t\u00e4hed nummerdada. Loomulik oleks n\u00e4iteks A j\u00e4rjekorranumbriks v\u00f5tta 1, B korral 2 jne. Seda me siiski ei tee, sest t\u00e4htedel ja paljudel teistel (sealhulgas n\u00e4htamatutel) m\u00e4rkidel on sellised j\u00e4rjekorranumbrid juba olemas. Vastava j\u00e4rjekorranumbri saame teada funktsiooniga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ord<\/code>. Katseta n\u00e4iteks k\u00e4ske:<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">print(ord(\"A\"))\r\nprint(ord(\"a\"))\r\nprint(ord(\"\u00e4\"))\r\nprint(ord(\"\u00f5\"))\r\nprint(ord(\" \"))<\/pre>\r\n<p class=\"vspace\">N\u00e4iteks n\u00e4eme, et t\u00e4pit\u00e4hed on meie \u00fclej\u00e4\u00e4nud t\u00e4hestikust hoopis eemal, kuna need pole osa ladina p\u00f5his\u00fcmbolitest.<\/p>\r\n<p class=\"vspace\">Funktsiooniga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">chr<\/code> saame teada arvule vastava m\u00e4rgi:<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">print(chr(65))<\/pre>\r\nProovi ka p\u00e4ris suurte arvudega. Pikemalt on sellest juttu silmaringimaterjalis.\r\n\r\nKirjutame n\u00fc\u00fcd programmi, mis sisestatud s\u00f5ne \u0161ifreeritult faili kirjutaks:\r\n\r\n<strong>N\u00e4iteprogramm. \u0160ifreeritud kirjutamine<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">def kodeeri(s\u00fcmbol, nihe):\r\n     return chr(ord(s\u00fcmbol) + nihe)\r\n \r\ndef \u0161ifreeri(failinimi, nihe):\r\n    f = open(failinimi, \"w\")\r\n    kiri = input(\"Sisesta lause \")\r\n    for s\u00fcmbol in kiri:\r\n        f.write(kodeeri(s\u00fcmbol, nihe))\r\n    f.close()\r\n \r\nfailinimi = input(\"Faili nimi? \")\r\nnihe = int(input(\"Nihe? \"))\r\n\u0161ifreeri(failinimi, nihe)<\/pre>\r\nKatseta \u0161ifreerimise programmi.\r\n\r\nJ\u00e4rgmiseks on meil loomulikult tarvis \u0161ifreeritud fail tagasi loetavaks s\u00f5numiks muuta. Pakume siin m\u00f5ned juhtn\u00f6\u00f6rid:\r\n<ul>\r\n \t<li>Funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">dekodeeri<\/code> on funktsioonile <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">kodeeri<\/code> \u00fcsna sarnane. Kui \u0161ifreerimisel tuli nihe liita, siis de\u0161ifreerimisel tuleb see lahutada.<\/li>\r\n \t<li>Kui \u0161ifreerimisel avati fail kirjutamiseks, siis de\u0161ifreerimisel tuleb see avada lugemiseks.\r\n<div class=\"vspace\"><\/div><\/li>\r\n \t<li>\r\n<div class=\"vspace\">\r\n\r\nS\u00fcmbolite \u00fchekaupa k\u00e4sitlemiseks saab kasutada sellist ts\u00fcklit\r\n<div>\r\n<div class=\"syntaxhighlighter nogutter python\">\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">while True:\r\n    s\u00fcmbol = f.read(1)                      # loetakse \u00fcks s\u00fcmbol\r\n    if s\u00fcmbol == \"\":                        # kui s\u00fcmboleid enam pole\r\n        break                               # ts\u00fckkel katkestatakse\r\n    print(dekodeeri(?????????), end = \"\")   # reavahetust ei tule<\/pre>\r\n<\/div>\r\n<\/div>\r\n<p class=\"vspace\">K\u00fcsim\u00e4rgid tuleb asendada vastavalt sellele, kuidas funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">dekodeeri<\/code> tehtud on.<\/p>\r\n\r\n<\/div>\r\n&nbsp;<\/li>\r\n<\/ul>\r\n<h2>Video<\/h2>\r\nVaata ka andmevahetust kokkuv\u00f5tvat videot:\r\n\r\nhttps:\/\/www.youtube.com\/watch?v=mJwWZgu-YwI","rendered":"<h3>T\u00fchja faili kirjutamine<\/h3>\n<p class=\"vspace\">Eespool oleme tutvunud mitmete v\u00f5imalustega, kuidas failist andmeid lugeda. Failid on meil juba olemas olnud v\u00f5i oleme need ise tekstiredaktoriga teinud. N\u00fc\u00fcd vaatame, kuidas isetehtud programmiga andmeid faili kirjutada. Selleks pakub v\u00f5imalusi funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">write<\/code> (ingl <em>kirjuta<\/em>).<\/p>\n<p class=\"vspace\">J\u00e4rgmine programm kirjutab kasutajalt k\u00fcsitud andmed faili.<\/p>\n<p><strong>N\u00e4iteprogramm. Faili kirjutamine I<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">nimi = input(\"Palun sisesta oma nimi: \")\r\nvanus = input(\"vanus: \")\r\naadress = input(\"aadress: \")\r\n \r\nf = open(\"andmed3.txt\", \"w\")\r\nf.write(nimi + \"\\n\")\r\nf.write(vanus + \"\\n\")\r\nf.write(aadress + \"\\n\")\r\nf.close()<\/pre>\n<p class=\"vspace\">Faili kirjutamiseks tuleb funktsioonile <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">open<\/code> anda ka teine argument v\u00e4\u00e4rtusega <code>\"w\"<\/code> (nagu <em>write<\/em>). Kui sellise nimega fail juba eksisteerib, siis <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">open(..., \"w\")<\/code> teeb selle t\u00fchjaks. Erinevalt funktsioonist <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">print<\/code> ei tekita funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">write<\/code> automaatselt reavahetusi. Selleks, et saada andmeid eri ridadele, lisasime reavahetuse s\u00fcmboli k\u00e4sitsi.<\/p>\n<p class=\"vspace\">Proovime kirjutada programmi, mis k\u00fcsib kasutajalt kaks failinime. Esimene fail peaks olema juba olemas ja seal peaks olema mingi tekst. Teine fail v\u00f5iks olla uus. Programmi \u00fclesanne on v\u00f5tta esimese faili sisu, teisendada see suurt\u00e4htedesse ning kirjutada teise faili.<\/p>\n<p><strong>N\u00e4iteprogramm. \u00dchest failist teise \u00fcmberkirjutamine<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">doonorNimi = input(\"Mis failist info v\u00f5tta? \")\r\naktseptorNimi = input(\"Millisesse faili info pannakse? \")\r\ndoonorFail = open(doonorNimi, encoding=\"UTF-8\")\r\naktseptorFail = open(aktseptorNimi, \"w\")\r\nfor rida in doonorFail:\r\n    aktseptorFail.write(rida.upper())\r\ndoonorFail.close()\r\naktseptorFail.close()<\/pre>\n<p class=\"vspace\">Ka faili kirjutamiseks saab m\u00e4\u00e4rata kodeeringu, n\u00e4iteks <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">open(aktseptorNimi, \"w\", encoding=\"UTF-8\")<\/code>.<\/p>\n<h3>Failile juurde kirjutamine<\/h3>\n<p class=\"vspace\">Kui funktsiooni <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">open<\/code> teine argument on <code>\"a\"<\/code>, siis kirjutatakse olemasoleva faili l\u00f5pust edasi ning varasem sisu s\u00e4ilib muutmata. Kui sellist faili pole, siis see luuakse. Ka siin saab m\u00e4\u00e4rata kodeeringu, n\u00e4iteks <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">open(failiNimi, \"a\", encoding=\"UTF-8\")<\/code>. Argument <code>\"a\"<\/code> tuleb ingliskeelsest s\u00f5nast <em>append<\/em> (<em>lisa<\/em>).<\/p>\n<h3>Temperatuurid veebist faili<\/h3>\n<p class=\"vspace\">Kirjutame programmi, mis loeb aadressilt <a class=\"urllink\" href=\"http:\/\/meteo.physic.ut.ee\/\" target=\"_blank\" rel=\"noopener\">http:\/\/meteo.physic.ut.ee\/<\/a> aasta 2017 jaoks iga p\u00e4eva keskmise temperatuuri ja kirjutab selle faili. \u00dche aasta andmete t\u00f6\u00f6tlemine v\u00f5tab aega umbes pool minutit. Programmis kasutatakse kahekordset ts\u00fcklit, mille p\u00f5hjalikum k\u00e4sitlus j\u00e4\u00e4b siinsetest materjalidest v\u00e4lja.<\/p>\n<p><strong>N\u00e4iteprogramm. Temperatuurid veebist faili<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from urllib.request import urlopen\r\n \r\nfail = open(\"andmed.txt\", \"a\") # fail avatakse juurde kirjutamiseks\r\np\u00e4evad = [31,28,31,30,31,30,31,31,30,31,30,31]\r\naasta = 2017\r\n \r\nfor kuu in range(1,13): # v\u00e4limine ts\u00fckkel kuude j\u00e4rjenumbrite kaupa\r\n    for p\u00e4ev in range(1, p\u00e4evad[kuu-1]+1): # sisemine ts\u00fckkel p\u00e4evade kaupa\r\n        # konkreetse p\u00e4eva andmed\r\n        vastus = urlopen(\"http:\/\/meteo.physic.ut.ee\/et\/showperiod.php?type=setday&amp;year=\"+str(aasta)+\"&amp;month=\"+str(kuu)+\"&amp;day=\"+str(p\u00e4ev))\r\n        baidid = vastus.read()\r\n        tekst = baidid.decode()\r\n \r\n        otsitav = \"&lt;SMALL&gt;keskmine&lt;\/SMALL&gt;&lt;BR&gt;&lt;B&gt;\"\r\n        algus = tekst.index(otsitav) # leitakse \u00f5ige koht\r\n        temp_algus = algus + len(otsitav) # siit algab temperatuur\r\n        deg = tekst.index(\" &amp;deg;\") # siin l\u00f5peb\r\n        temp = tekst[temp_algus:deg] # viilutades leitakse temperatuur\r\n        # funktsioon rjust paneb \u00fchekohalisele p\u00e4eva ja kuu j\u00e4rjenumbrile 0 ette, et oleks kahekohaline. \r\n        fail.write(str(p\u00e4ev).rjust(2,\"0\")+\".\"+str(kuu).rjust(2,\"0\")+\".\"+str(aasta)+\": \"+str(temp)+\"\\n\")\r\n \r\n \r\nvastus.close()\r\nfail.close()<\/pre>\n<h3>Enesekontroll (1 k\u00fcsimus)<\/h3>\n<p><code><\/p>\n<div id=\"h5p-42\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-42\" class=\"h5p-iframe\" data-content-id=\"42\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"andmevahetus-3-avamine\"><\/iframe><\/div>\n<\/div>\n<p><\/code><\/p>\n<h3>\u0160ifreerimine<\/h3>\n<p class=\"vspace\">Tegeleme natuke salakirjadega. Me ei kirjuta faili mitte s\u00fcmboli enda, vaid mingi kindla teise s\u00fcmboli. N\u00e4iteks kui me kirjutame t\u00e4he <code>A<\/code> asemel t\u00e4hestikus 4 kohta edasi paikneva t\u00e4he E, siis s\u00f5ne <code>AEG<\/code> asemel kirjutaksime hoopis <code>EIK<\/code>. Sellise tegevuse nimetus on nihke\u0161iffer, mis on ajalooliselt tuntud meetod salakirja kirjutamiseks. Kui nihe on teada, siis on teksti lihtne isegi k\u00e4sitsi de\u0161ifreerida, arvutist r\u00e4\u00e4kimata. Ka tundmatu nihke korral on v\u00f5imalik \u0161iffer \u00fcsna kiiresti murda.<\/p>\n<p class=\"vspace\">Kuna me tahame t\u00e4hti j\u00e4rjekorranumbri alusel nihutada, siis oleks m\u00f5istlik t\u00e4hed nummerdada. Loomulik oleks n\u00e4iteks A j\u00e4rjekorranumbriks v\u00f5tta 1, B korral 2 jne. Seda me siiski ei tee, sest t\u00e4htedel ja paljudel teistel (sealhulgas n\u00e4htamatutel) m\u00e4rkidel on sellised j\u00e4rjekorranumbrid juba olemas. Vastava j\u00e4rjekorranumbri saame teada funktsiooniga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ord<\/code>. Katseta n\u00e4iteks k\u00e4ske:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">print(ord(\"A\"))\r\nprint(ord(\"a\"))\r\nprint(ord(\"\u00e4\"))\r\nprint(ord(\"\u00f5\"))\r\nprint(ord(\" \"))<\/pre>\n<p class=\"vspace\">N\u00e4iteks n\u00e4eme, et t\u00e4pit\u00e4hed on meie \u00fclej\u00e4\u00e4nud t\u00e4hestikust hoopis eemal, kuna need pole osa ladina p\u00f5his\u00fcmbolitest.<\/p>\n<p class=\"vspace\">Funktsiooniga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">chr<\/code> saame teada arvule vastava m\u00e4rgi:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">print(chr(65))<\/pre>\n<p>Proovi ka p\u00e4ris suurte arvudega. Pikemalt on sellest juttu silmaringimaterjalis.<\/p>\n<p>Kirjutame n\u00fc\u00fcd programmi, mis sisestatud s\u00f5ne \u0161ifreeritult faili kirjutaks:<\/p>\n<p><strong>N\u00e4iteprogramm. \u0160ifreeritud kirjutamine<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">def kodeeri(s\u00fcmbol, nihe):\r\n     return chr(ord(s\u00fcmbol) + nihe)\r\n \r\ndef \u0161ifreeri(failinimi, nihe):\r\n    f = open(failinimi, \"w\")\r\n    kiri = input(\"Sisesta lause \")\r\n    for s\u00fcmbol in kiri:\r\n        f.write(kodeeri(s\u00fcmbol, nihe))\r\n    f.close()\r\n \r\nfailinimi = input(\"Faili nimi? \")\r\nnihe = int(input(\"Nihe? \"))\r\n\u0161ifreeri(failinimi, nihe)<\/pre>\n<p>Katseta \u0161ifreerimise programmi.<\/p>\n<p>J\u00e4rgmiseks on meil loomulikult tarvis \u0161ifreeritud fail tagasi loetavaks s\u00f5numiks muuta. Pakume siin m\u00f5ned juhtn\u00f6\u00f6rid:<\/p>\n<ul>\n<li>Funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">dekodeeri<\/code> on funktsioonile <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">kodeeri<\/code> \u00fcsna sarnane. Kui \u0161ifreerimisel tuli nihe liita, siis de\u0161ifreerimisel tuleb see lahutada.<\/li>\n<li>Kui \u0161ifreerimisel avati fail kirjutamiseks, siis de\u0161ifreerimisel tuleb see avada lugemiseks.\n<div class=\"vspace\"><\/div>\n<\/li>\n<li>\n<div class=\"vspace\">\n<p>S\u00fcmbolite \u00fchekaupa k\u00e4sitlemiseks saab kasutada sellist ts\u00fcklit<\/p>\n<div>\n<div class=\"syntaxhighlighter nogutter python\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">while True:\r\n    s\u00fcmbol = f.read(1)                      # loetakse \u00fcks s\u00fcmbol\r\n    if s\u00fcmbol == \"\":                        # kui s\u00fcmboleid enam pole\r\n        break                               # ts\u00fckkel katkestatakse\r\n    print(dekodeeri(?????????), end = \"\")   # reavahetust ei tule<\/pre>\n<\/div>\n<\/div>\n<p class=\"vspace\">K\u00fcsim\u00e4rgid tuleb asendada vastavalt sellele, kuidas funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">dekodeeri<\/code> tehtud on.<\/p>\n<\/div>\n<p>&nbsp;<\/li>\n<\/ul>\n<h2>Video<\/h2>\n<p>Vaata ka andmevahetust kokkuv\u00f5tvat videot:<\/p>\n<p><iframe loading=\"lazy\" id=\"oembed-1\" title=\"Informaatika valikkursus g\u00fcmnaasiumile - Andmevahetus\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/mJwWZgu-YwI?feature=oembed&#38;rel=0\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/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-246","chapter","type-chapter","status-publish","hentry"],"part":233,"_links":{"self":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/246","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":7,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/246\/revisions"}],"predecessor-version":[{"id":583,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/246\/revisions\/583"}],"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\/246\/metadata\/"}],"wp:attachment":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/media?parent=246"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapter-type?post=246"},{"taxonomy":"contributor","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/contributor?post=246"},{"taxonomy":"license","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/license?post=246"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}