Datoteke - uporaba funkcij in metod

Datoteke - uporaba funkcij in metod

Avtor: Svetlana Novak

Učni cilji: Dijak se nauči uporabljati funkcije in metode za delo z datotekami v programskem jeziku Python.

Datoteke - uvod

Potrebno predznanje:

  • kaj so datoteke in delo z datotekami v operacijskem sistemu
  • kaj so nizi
  • seznami in metode za delo s seznami
  • metoda split
  • metoda rstrip
  • vključevanje modulov v program (import)
  • funkcije: ustvarjanje novih in klicanje

Datoteke - uvod

Uvod

Datoteke uporabimo, kadar želimo pomniti podatke, da bodo dostopni za kasnejšo uporabo. V gradivu bomo govorili o tekstovnih datotekah, v katerih je vsebina razdeljena v vrstice. Delo z datotekami je podobno delu z vhodno/izhodnimi tokovi, pri katerih pišemo/beremo na strandardne vhode/izhode kot sta tipkovnica za vhod in prikaz na ekran kot izhod. Pri datotekah pa govorimo o branju/pisanju iz/v datoteke. Python ima vgrajeno funkcijo za dostop do datoteke, pravimo ji open. Ta funkcija vrne podatkovni tip file . Ti podatkovni tipi imajo metode, ki omogočajo rokovanje z vsebino datoteke:

  • open
  • read, readline
  • write

Naloga: primerjaj vpisovanje v spremenljivko preko tipkovnice in branje iz datoteke ter prikazovanje na ekran s pisanjem v datoteko.

Delo z vhodnimi in izhodnimi tokovi

Napišite ukaz, pri katerih na začetku vpišete niz, ki predstavlja EMŠO. Izpišite ga v obratnem vrstnem redu.

Rešitev:


emso = input("Vpišite EMŠO osebe: ") #vpis podatka
print(emso[::-1])    #prikaži emšo v obratnem vrstnem redu

Primer (EMŠO številka je izmišljena in brez preverjanja veljavnosti):

>>> emso = input("Vpišite EMŠO osebe: ")
Vpišite EMŠO osebe: 12123456789
>>> print(emso[::-1])
98765432121

Delo z datotekami

Napišite ukaz, pri katerih na začetku prebereš iz datoteke niz, ki predstavlja EMŠO. Zapišite ga v drugo datoteko v obratnem vrstnem redu.

Rešitev:

(DN2_4.png)
Slika 1: Delo z datotekami.




Funkcija input je tako podobna metodi readline (obe vrneta niz), print pa je podoben write.

Datoteke - odpiranje in zapiranje datoteke

V Pythonu je uveden nov tip podatkov, ki mu pravimo file. File odpremo, da lahko beremo iz obstoječe datoteke oz. da v njo pišemo. Datoteke po uporabi tudi zapremo.

Odpiranje datotek

Datoteke odpiramo na več načinov:


A. odpri datoteko za branje

V spodnjem primeru so naslednji deli ukaza open:

  • dat - logična oznaka datoteke
  • open - metoda za odpiranje
  • 'datoteka.txt' - ime fizične datoteke v trenutni mapi programa
  • 'r' - oznaka za branje (read)


dat = open('datoteka.txt', 'r')

Pri odpiranju datoteke za branje lahko drugi parameter tudi izpustimo:

dat = open('datoteka.txt')

V tem primeru je ukaz za pisanje v datoteko write prepovedan. Datoteka mora pred odpiranjem obstajati, sicer se izpiše napaka.

(DN2_2.png)
Slika 2: Datoteka 'datoteka.txt' ne obstaja.




B. odpri datoteko za pisanje

V spodnjem primeru so naslednji deli ukaza open:

  • ostalo glej branje
  • 'w' - oznaka za pisanje (write)


dat = open('datoteka.txt', 'w')

Pri odpiranju datoteke za pisanje z vrednostjo drugega parametra 'w' odpremo prazno datoteko. Pozor: če datoteka že obstaja, se vsi podatki pri tem načinu odpiranja datoteke iz datoteke izbrišejo, če pa datoteke ni, se ustvari nova.


C. odpri datoteko za dodajanje vsebine v datoteko

V spodnjem primeru so naslednji deli ukaza open:

  • ostalo glej branje
  • 'a' - oznaka za dodajanje (append)


dat = open('datoteka.txt', 'a')

Pri odpiranju datoteke za pisanje z vrednostjo drugega parametra 'a' odpremo datoteko, ki že vsebuje podatke, ki jih ne želimo izbrisati.

Opomba: Pri odpiranju datoteke za branje oz. dodajanje v datoteko mora datoteka obstajati, sicer se izpiše napaka.
Ime fizične datoteke pri vseh treh načinih odpiranja lahko vsebuje tudi pot, ki jo uporabimo pred imenom. Za ločevanje map in podmap se uporablja poševnica nazaj, v nizih Pythona pa pred njo moramo napisati še eno poševnico nazaj (glej nize in posebne znake). Tako v primeru, da ne beremo iz iste mape, v kateri je program, dodamo še pot:

dat = open('c:\\temp\\datoteka.txt', 'a')


Datoteke - odpiranje in zapiranje datoteke

Zapiranje datotek

Podatkovni tok branja ali pisanja v datoteke po uporabi zapremo. S tem se nam podatki tudi fizično zapišejo v datoteko na disku. Zapiramo vse odprte datoteke ne glede na način odpiranje (branje, pisanje, dodajanje).

Primer: prepiši vsebino datoteke v drugo datoteko. Ukaza read in write sta razložena v nadaljevanju gradiva.

(DN2_3.png)
Slika 3: Zapiranje datotek po uporabi.

Datoteke - obstoj

V primerih, ko smo datoteko odpirali za branje oz. dodajanje vsebine, prejmemo sporočilo, če datoteka ne obstaja in se nam program prekine. Z uporabo modula os , ki ga vključimo na začetku programa, omogočimo preverjanje obstoja datotek, imenikov, ki jih lahko tudi kreiramo oz. brišemo. Uporabimo lahko naslednje metode:

  • os.mkdir(pot) - ustvari mapo pot
  • os.rename(kaj,kam) - preimenuj, kaj - izvor, kam - ciljno ime
  • os.rmdir(pot) - odstrani mapo pot

In objekt path s koristnimi metodami:

  • os.path.getsize(pot) - velikost mape pot
  • os.path.isdir(pot) - ali pot mapa obstaja
  • os.path.dirname(pot) - ime direktorija za mapo pot
  • os.path.isfile(ime) - vrne True oz. False če datoteka ime obstaja/ne obstaja

Naloga: Ustvarite datoteko, če je ni.

Rešitev:

Rešitev

Neki

Ustvarite datoteko, če je ni.

Rešitev:

Z metodo os.path.isfile(imeDat) ugotovimo, če datoteka ime skupaj s pripadajočo potjo, obstaja.

(DN2_5.png)
Slika 4: Odpri datoteko za dodajanje ('a'), če obstaja, in novo ('w'), če je ni.

Zapri


Datoteke - pisanje na datoteko

A. pisanje z metodo write

V datoteke lahko pišemo, če smo jih odprli na način odpri za pisanje z metodo open in drugim parametrom metode z vrednostjo 'w' ter za dodajanje z metodo open in drugim parametrom 'a' (glej odpiranje datotek).


datZaPisanje = open("tuPisem.txt",'w')

Z ukazom write dodamo vrstice. Če so podatki v datoteki zapisani vsako v svoji vrsti, moramo na konec vsebine za vrstico dodati tudi znak za novo vrsto ('\n').

Primer: zapiši dve vrsti besedila in nato števila med 1 in 10 vsako v svojo vrsto.

(DN2_6.png)
Slika 5: Pisanje v datoteko z metodo write.

B. pisanje z metodo print

Za pisanje lahko uporabimo tudi ukaz print, ki mu dodamo še lastnost file:


print('Zapišimo še to!', file = datZaPisanje)

kar je isto kot


datZaPisanje.write('Zapišimo še to!\n')

Oziroma obratno:


datZaPisanje.write('Zapišimo še to!')

kar je isto kot


print('Zapišimo še to!', end='', file = datZaPisanje)

V zgornjem primeru iz print odstranimo znak za konec vrstice, ker ga ni tudi v write stavku.

Primer: zapiši dve vrsti besedila in nato števila med 1 in 10 vsako v svojo vrsto. Uporabite funkcijo print.

(DN2_7.png)
Slika 6: Pisanje v datoteko s funkcijo print.

Datoteke - dodajanje vsebine

Z metodo open(imeDatoteke, 'w') ustvarimo novo datoteko. Kaj pa če so v datoteki že podatki in jih nočemo izgubiti? Potem datoteko odpremo z metodo open z vrednostjo drugega parametra 'a', kar pomeni dodaj (append). Nove vsebine se dodajo na konec datoteke.

Datoteka mora pred odpiranjem obstajati.

Uporaba: dodajanje vsebine

Datoteke - branje

Odpiranje datoteke za branje

Pri branju datotek odpremo datoteke z metodo open in drugim parametrom z vrednostjo 'r' ali brez. Prvi parameter je niz, v katerem je ime datoteke s potjo.



dat1 = open('beri1.txt', 'r')
dat2 = open('c:\\temp\\dobro\\beri2.dat')

V zgornji kodi moramo, ko dodajamo poševnico nazaj za ločevanje map in podmap, v katerih se datoteka nahaja, dodati še eno poševnico nazaj '\', ker je to poseben znak, ki potrebuje pred seboj še eno poševnico nazaj, da se pot pravilno upošteva.

Opomba: hkrati ne moremo brati in pisati v datoteko, tako da je ukaz open(imeDatoteke, 'rw') ni dovoljeno.

Metode za branje

readline()

  • za branje tekoče vrstice z znakom za konec vrstice
  • za ugotavljanje konca datoteke


if dat.readline() == '':
    print('Konec datoteke.')

Vendar:


if dat.readline() == '\n':
    print('Prazna vrstica.')

read()

  • za branje cele datoteke od trenutne vrstice do konca


vse = dat.read()
print(vse)

Datoteke - branje: zgled

Naloga: prepiši celo datoteko in pred vsako vrstico napiši število znakov vrstice

(DN2_12.png)
Slika 7: Uporaba readline().

Datoteke - koristne metode

Pretvorba v števila

Metode branja readline() vrne niz vrstica.

Uporaba funkcij za pretvorbo v števila:

  • c_stevilo = int(vrstica) #celo število
  • f_stevilo = float(vrstica) #decimalno število float

Pretvorbo lahko delamo, če je v posamezni vrstici samo število.

Pri pretvorbi int in float ne motijo "beli presledki" (znaki za konec vrstice, presledke, tabulatorje):

#pretvori število v vrstici v celo število
c_stevilo = int(beriDat.readline())



Ločevanje podatkov v vrsticah, združevanje v nize

Ko je v vrsticah več kot en podatek, jih ločimo med seboj. Uporabimo metodo split nad vrstico. Ločilni znak je lahko poljuben. Metoda vrne seznam nizov, ki jih po potrebi spremenimo v števila, če jih npr. želimo sešteti.



dat = open('beri.txt')
vrstica = dat.readline()
seznam = vrstica.split()
' '.join(seznam)



Znebimo se dodatkov

Z metodo rstrip() odstranimo znak na koncu vrstice (desno slačenje) oz. odstranimo bele presledke (znak za konec vrstice, presledke, tabulatorje).



dat = open('beri.txt')
vrstica = dat.readline()

#odstrani znak za konec vrstice, spremembo shrani v isto spremenljivko
vrstica = vrstica.rstrip('\n')
seznam = vrstica.split()
' '.join(seznam)


Zgled: zgornje metode rstrip, split in join so uporabljene pri filmčku za dodajanje vsebine.

(DN2_11.png)
Slika 8: Koda z metodami rstrip, split in join pri datotekah.

Datoteke - branje preko vseh vrstic

Branje preko vseh vrstic:

  • v zanki while


vrstica = datBeri.readline()
while vrstica != '' : # do konca datoteke
   # nekaj naredimo z vrstico …

   vrstica = datBeri.readline()

  • v zanki for


for vrstica in datBeri:
    # nekaj naredimo z vrstico
    …
datBeri.close()

oz.

for vrstica in open(imeDat):
   # nekaj naredimo z vrstico
   …


V zgornjem primeru se datoteka avtomatično zapre, ker nimamo datotečne spremenljivke.

Datoteke: vprašanje 1

Kaj izvede naslednje zaporedje ukazov?


tuPišem = open('Podatki.txt', 'w')

for i in range(1, 101) :

    tuPišem.write(str(i) + ". vrstica\n")

tuPišem.Close()

Izberite pravilni odgovor.

Preveri

Pravilno

Dobro poznaš delo z datotekami.

Naprej

Napačno

Mogoče še nekaj časa posvetiš teoriji? Poskusi še enkrat. Saj bo šlo.

Zapri

Datoteke: vprašanje 2

Za sledečo kodo

vrstica = datBeri.readline()

while vrstica != '':
    #nekaj naredimo z vrstico
    vrstica = datBeri.readline()


izberite med spodnjimi odgovori pravilni odgovor, kaj pomeni pogoj v while stavku.

Izberite pravilni odgovor.

konec datoteke
spremenljivka vrstica je prazna
datoteka je prazna
pogoj je napačen

Pravilno

Čestitam. Le tako naprej.

Naprej

Napačno

Malo je zmanjkalo. Ne obupajte. Poskusite še enkrat.

Zapri

Datoteke: vprašanje 3

Za odpiranje datotek obstaja nekaj načinov, ki jih izberemo z dodajanjem prave vrednosti drugega parametra v metodi open. Kako odpremo datoteko za branje? Izberite dva (2) pravilna odgovora.

Pravilno

Poiskali ste vse pravilne odgovore. Odlično. Kviz je zaključen.

Naprej

Napačno

Odgovor ni popoln. Prosim, potrudite se še malo.

Zapri

Datoteke: primer uporabe - naključna števila

Naloga:

Sestavite funkcijo, ki ustvari datoteko NakStevX.dat z n nakljucnimi števili med a in b. X naj bo prvo "prosto" naravno število. Če torej obstajajo datoteke NakStev1.dat, NakStev2.dat in NakStev3.dat, naj metoda ustvari datoteko NakStev4.dat. Števila izpišite levo poravnana po k v vsaki vrsti, torej npr. kot:

12 134 23 22 78 167 12 1 134 45 13 9


Postopek reševanja Najprej z uporabo modula os in z izdelavo seznama datotek poiščemo zadnjo datoteko NakStevX.dat, kjer je X število. Zadnjo datoteko poiščemo z izločanjem števila X iz imena datotek. Nato v novo datoteko vpišemo n naključnih števil med a in b po k v vsako vrsto. Števila so v datoteki med seboj ločena s presledkom. V prvi funkciji tako kreiram novo datoteko, v drugi, ki sprejme vrednosti obeh meja števil a in b, vrednost vseh števil v datoteki in število števil v vrsti k, pa izpišem seznam n naključnih števil po k v vrsti.

Prva funkcija (poisciDatoteko):

  • Parametra funkcije sta dva niza: začetek imena datoteke in končnica datoteke.
  • V zanki poiščemo naslednjo datoteko po vrsti, glede na začetek imena in zaporedne številke ter končnice.
  • Funkcija vrne ime naslednje prazne datoteke.

Druga funkcija (nakljucnaStevila):

  • Parameter funkcije je začetek imena datoteke in končnica datoteke, spodnja in zgornja meja števil, število vseh števil v datoteki in število števil v eni vrsti.
  • Odpremo novo datoteko, ki smo jo našli s prvo funkcijo. Odpremo jo za pisanje, kjer je vrednost drugega parametra 'w' - odpri prazno datoteko za pisanje.
  • nastavimo zanko, v kateri vpišemo n števil v odprto datoteko. Števila ustvarimo s funkcijo za naključna števila randint in sicer med številoma a in b. Števila zapisujemo po vrsti, med njimi so presledki. V posamezni vrsti je k števil. V zadnji jih je lahko manj in sicer toliko, koliko je ostanek pri deljenju s k.
  • Ob koncu programa zapremo datoteko.

Rešitev:

(DN2_1.png)
Slika 9: Zapis naključnih števil v datoteko
0%
0%