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
Potrebno predznanje:
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:
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:
|
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 = 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.
|
B. odpri datoteko za pisanje
V spodnjem primeru so naslednji deli ukaza open:
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:
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.
|
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:
In objekt path s koristnimi metodami:
Naloga: Ustvarite datoteko, če je ni.
Rešitev:
Ustvarite datoteko, če je ni.
Rešitev:
Z metodo os.path.isfile(imeDat) ugotovimo, če datoteka ime skupaj s pripadajočo potjo, obstaja.
|
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.
|
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.
|
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()
if dat.readline() == '':
print('Konec datoteke.')
Vendar:
if dat.readline() == '\n':
print('Prazna vrstica.')
read()
vse = dat.read()
print(vse)
Datoteke - branje: zgled
Naloga: prepiši celo datoteko in pred vsako vrstico napiši število znakov vrstice
|
Datoteke - koristne metode
Pretvorba v števila
Metode branja readline() vrne niz vrstica.
Uporaba funkcij za pretvorbo v števila:
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.
|
Datoteke - branje preko vseh vrstic
Branje preko vseh vrstic:
vrstica = datBeri.readline()
while vrstica != '' : # do konca datoteke
# nekaj naredimo z vrstico …
vrstica = datBeri.readline()
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.
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.
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.
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):
Druga funkcija (nakljucnaStevila):
Rešitev:
|