Python - osnove dela z datotekami

Python - osnove dela z datotekami

Avtor: Sevludin Halilović

Težavnost: srednja težka

Predvideni čas: 10-20 min

Učni cilji: Učenec zna: določiti večkratnike števil, pozna pravila za deljivost z 2 in 6, uporablja zanki while in for, uporablja stavek if, zna izpisovati v tekstovno datoteko

Naloga

Sestavi funkcijo, ki v tekstovno datoteko

 Stevila.txt

zapiše prvih n sodih števil, ki niso deljiva s šest. Števila izpišimo ločena z znakom '/', na primer kot:

 2/4/8/10/14/16/20/22/

Strategija reševanja

Da rešimo to nalogo, bomo postopoma ponovili vse, kar potrebujemo:

  1. najprej bomo ponovili snov matematike 6. in 7. razreda o deljivosti naravnih števil - DA SE NE POZABI!
  2. nato bomo razmislili o ustreznosti posameznega števila - pogojni stavek
  3. potrebovali bomo števec, ki bo štel ustrezne večkratnike - da ne prekoračimo želeno število le-teh
  4. uporabiti moramo zanko, ki bo preverjala izpolnjenost pogoja in "ukazovala" ponavljanje preverjanja ustreznosti števil - zanka while
  5. potrebovali bomo zanko, s pomočjo katere se bo naša spremenljivka "sprehodila" po zaporedju sodih števil - zanka for
  6. odpreti bomo morali tekstovno datoteko, v katero bomo zapisali rešitev (rezultat).

Deljivost naravnih števil

V 6. in 7. razredu smo se naučili pravila za deljivost naravnih števil. Da jih ne pozabimo, jih bomo ponovili:

ZADNJA ŠTEVKA oz ENOMESTNI KONEC:

  • število je deljivo z 2, če je zadnja števka 0, 2, 4, 6 ali 8
  • število je deljivo s 5, če je zadnja števka 0 ali 5
  • število je deljivo z 10, če je zadnja števka 0

DVOMESTNI KONEC:

  • število je deljivo s 4, če je dvomestni konec deljiv s 4
  • število je deljivo s 25, če je dvomestni konec enak 00, 25, 50 ali 75
  • število je deljivo s 100, če je dvomestni konec enak 00

TRIMESTNI KONEC:

  • število je deljivo z 8, če je trimestni konec deljiv z 8
  • število je deljivo s 125, če je trimestni konec deljiv s 125
  • število je deljivo s 1000, če je trimestni konec enak 000

VSOTA ŠTEVK:

  • število je deljivo s 3, če je vsota števk deljiva s 3
  • število je deljivo z 9, če je vsota števk deljiva z 9

Če se malo bolje pogleda prve 3 skupine

2 - 5 - 10,

4 - 25 - 100,

8 - 125 - 1000

se kaj hitro opazi lepa pravilnost: produkt manjših dveh je enak največjemu številu.

Nadaljevanje strategije

To pravilnost se lahko uporabi pri iskanju pravila za deljivost s katerim koli sestavljenim številom (tj. ki ni praštevilo ali 1). Mi ga bomo uporabili pri pravilu za deljivost s 6:

2 - 3 - 6

ali drugače

Pravilo za deljivost s 6 bi se torej glasilo:

  • število je deljivo s 6, če je deljivo z 2 in s 3 HKRATI.

Torej:

  1. zanimajo nas števila, ki so deljiva z 2
  2. in niso deljiva s 3

Zakaj s 3?

Zato, ker, če ni deljivo s 3, ni deljivo niti s 6.

Zgoraj napisano ni nujno potrebno za reševanje naše naloge, je pa vseeno dobro ponoviti, če smo slučajno pozabili.

Deljivost s Pythonom

Kako deljivost preverjamo s Pythonom?

Python se lahko med drugim uporabi tudi kot izredno močan kalkulator.

In ena od funkcij, ki jo potrebujemo za reševanje našega problema, je ostanek pri deljenju. Za to se uporablja znak %.

Na primer:

17 % 5
2

Ker z ostankom 2.

Kakšen je pa ostanek pri deljenju dveh števil, ki sta si v razmerju "večkratnik - delitelj"?

Odgovor:
Je enak številu 0.

Primer:

15 % 5
0

Ker z ostankom 0

Pogojni stavek

Za preverjanje deljivosti bomo uporabili stavek if oz. pogojni stavek.

Če bo število deljivo z 2 in ne s 3, bo ustrezno, če pa bo deljivo in z 2 in s 3, bo neustrezno in ga ne bomo upoštevali.

Za prevetjanje enakosti (ali bo ostanek pri deljenju enak 2) se uporablja dvojni enačaj "==". Enega uporabimo, ko neki spremenljivki določamo vrednost.

Če želimo preverjati neenakost (ali je ostanek pri deljenju različen od 0) pa uporabimo "!="

Pogoja bi zgledala takole:

if i % 2 == 0:
if i % 3 != 0:

ali združena v krajši zapis s pomočjo and:

if i % 2 == 0 and i % 3 != 0:

Zanka for

Če pogledamo množici večkratnikov:

V2 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20...} in

V6 = {6, 12, 18, 24, 30...}

vidimo, da so vsi večktatniki števila 6 vsebovani v množici večkratnikov števila 2.

Torej potrebujemo nekaj, kar bo "preletelo" vse večkratnike števila 2 in bi izločilo vse večkratnike števila 6 (oz. večkratnike števila 3 - glej četrto stran povezava).

Za to je primerna zanka for.

for i in range (0, k, 2):

Kaj je (range (0, k, 2) ?

Imamo spremenljivko i, ki bo tekla od 0 do nekega števila k, s korakom 2.

Katero je pa pravzaprav število k?

To je število, ki mora biti višje od n-tega večkratnika števila, ki ga vnese uporabnik programa, ko bo klical funkcijo z želenim številom večkratnikov števila 2, ki niso večkratniki števila 6.

Torej:

če želi uporabnik 5 izpisanih ustreznih večkratnikov, bi to bili:

2, 4, 8, 10, 14.

Po natančnejšem razmisleku bi bilo bolje napisati n * 3, ker je 5 * 3 = 15, kar je že čez 14, ki je zadnji ustrezen večkratnik.

Torej zgornja meja našega intervala, znotraj katerega iščemo ustrezne večkratnike je:

.

Kaj pa pomeni število 2 v oklepaju  for i in range (0, n*3, 2):   ?

To je korak, s katerim se naj spremenljivka i premika med števili 0 in n * 3.

Na ta način se izognemo preverjanju vseh lihih števil, za katere že v štartu vemo, da niso ustrezna.

Zanka while

Zanko while potrebujemo zato, ker želimo zanko uporabljato dovolj veliko krat.

števec = 0
while števec < n:
    . . .
    števec = števec +1

Števec je spremenljivka, ki bo štela koliko ustreznih večkratnikov smo že našli.

Zanka se bo ponavljala vse dokler ne najdemo n ustreznih večkratnikov. Ko to število dosežemo, se zanka zaključi in se začne izvajati preostanek kode, ki je izven zanke while.

Funkcija

Funkcija je zelo koristen programček oz. del programa.

Lahko jo poljubno krat pokličemo znotraj istega programa ali iz drugega programa, če vemo v kateri mapi in v katerem dokumentu je napisana.

Ni potrebno celo funkcijo pisati še enkrat. Le pokličemo jo z ustreznimi parametri.

Pri naši nalogi je parameter število n, ki ga uporabnik vnese ob klicu funkcije, ko pove, koliko ustreznih večkratnikov želi imeti izpisanih.

Funkcijo se vedno najprej "definfira" z def , sledi ime funkcije , nato pa v oklepaju še morebitni parametri, ki jih funkcija potrebuje.

def sodaNeSestDat(n):

Jaz sem jo poimenoval sodaNeSestDat . Tako sem že v imenu funkcije povedal, kaj funkcija naredi:

poišče soda števila, ki niso večkratniki števila 6 in bodo izpisana v datoteko.

Datoteke

Programski jeziki nekoč praviloma niso imeli možnosti izpisovanja v tekstovne datoteke ali iz njih "jemati" podatke. Pythonu to možnost ima.

Datoteko ustvarimo z open('ime_datoteke', 'w') .

'w' pomeni pisanje (write) v datoteko. Če datoteke s tem imenom v našem direktoriju ni, se jo ustvari in pripravi za pisanje. Če pa obstaja, se izbriše vso vsebino in prav tako pripravi za pisanje.

Pišemo takole:

datotečnaSpremenljivka.write('Besedilo, ki ga želimo napisati')

ali takole:

print('Besedilo, ki ga želimo napisati', file = datotečnaSpremenljivka)

Mi bomo uporabili drugi način pisanja.

Vse, kar želimo izpisati v tekstovno datoteko, se najprej prenese v medpomnilnik, kjer "čaka", da odprto datoteko zapremo z ukazom close() . Šele nato se zapiše vanjo.

Ko datoteko zapremo, s Pythonom ne moremo več vanjo pisati ali iz nje brati.

Iz datoteke beremo z open('ime_datoteke', 'r') , kjer 'r' pomeni branje (read). Da pa bi sploh lahko brali iz nje, mora biti odprta open

Mnogokrat pa v že obstoječi datoteki ne želimo izbrisati vsebine, temveč jo le dopisati. To pa naredimo z open('ime_datoteke', 'a') , kjer 'a' pomeni dodajanje (add).

V tem primeru se novo besedilo dopisuje na koncu datoteke.

Če ne dodamo nobene izmed črk 'w', 'r', 'a' je privzeto, da je datoteka odprta za branje.

Rešitev

Če združimo vse, kar smo povedali do sedaj, bi rešitev zgledala tako:

def sodaNeSestDat(n):
    if n < 1:
        return ('Vnesi celo pozitivno število')             # omejimo vnos na pozitivna števila
    if n % 1 != 0:
        return ('Vnesi celo pozitivno število')             # omejimo vnos na cela števila
    else:
        Stevila = open('Stevila.txt', 'w')                  # odpremo (oz. ustvarimo) datoteko z imenom Stevila.txt
        števec = 0                                          # vrednost števca nastavimo na 0
        while števec < n:                                   # kako dolgo se naj ponavlja zanka
            for i in range (0, n*3, 2):                     # katere vrednosti naj zavzema spremenljivka i
                if (i % 2 == 0) and (i % 3 != 0):           # postavimo pogoje, ki poiščejo "ustrezne" večkratnike
                    števec = števec + 1
                    print(str(i), end="/", file = Stevila)  # v datoteko zapišemo "rezultat", pazimo na načim izpisa z /
        Stevila.close()                                     # datoteko zapremo, da se vsebina zapiše v datoteko

Ob klicih funkcije za različnimi parametri smo dobili:

>>> sodaNeSestDat(1.5)
'Vnesi celo pozitivno število'

>>> sodaNeSestDat(-10)
'Vnesi celo pozitivno število'

>>> sodaNeSestDat(20)
>>>

Kaj se je zgodilo ob tretjem klicu?

Nič!?

Nadaljevanje rešitve

Ne. zgodilo se je ravno tisto, kar smo želeli.

(beleznica.gif)
Izpisani podatki v datoteki Stevila.txt
0%
0%