Python nudi osnovne funkcije za delo z datotekami. Predvsem nas zanima branje in pisanje datotek, pa tudi njihovo brisanje, preimenovanje itd. Večino del z datotekami omogoča objekt file. Vsaj približno moramo razumeti, kako branje neke datoteke poteka:
Datoteko odpremo (kot bi odprli
knjigo).
In nato jo beremo po vrsti (kot bi
brali knjigo).
Do kam smo pri tem branju prišli,
kaže kazalec (kot da bi pri branju uporabljali prst).
Temu kazalcu pravimo kazalec
datoteke. V začetku seveda kazalec kaže na začetek datoteke in se
med branjem pomika naprej.
Podobno bi lahko ponazorili tudi, kako poteka (zaporedno) pisanje v datoteko. |
Preden neko datoteko beremo ali vanjo zapisujemo, jo moramo odpreti. To pomeni, da ustvarimo objekt file, ki omogoča vse naslednje klice. Splošna oblika stavka open(), ki odpre datoteko, je:
fileObj= open(imeDatoteke[, načinDostopa][, medpomnenje])
Podrobnosti o parametrih stavka open() so:
Seznam različnih načinov odpiranja datoteke je naslednji:
Način | Opis |
---|---|
r |
Datoteko odpiramo le za branje. Kazalec datoteke je postavljen na začetek datoteke. |
rb |
Datoteko odpremo samo za branje v binarnem formatu. Kazalec datoteke je postavljen na začetek datoteke |
r+ |
Datoteko odpremo za branje in pisanje vanjo. Kazalec datoteke kaže na začetek datoteke. |
rb+ |
Datoteko odpremo za branje in pisanje v binarnem formatu. Kazalec datoteke je na začetku. |
w |
Datoteko odpremo samo za pisanje. Če datoteka z danim imenom že obstaja, jo bomo "povozili. Če pa je še ni, bomo tvorili novo. |
wb | Datoteko odpremo za pisanje v branjem formatu. Če datoteka z danim imenom že obstaja, jo bomo "povozili. Če pa je še ni, bomo tvorili novo. |
w+ |
Datoteko odpremo za pisanje in branje. Če datoteka z danim imenom že obstaja, jo bomo "povozili. Če pa je še ni, bomo tvorili novo. |
wb+ |
Datoteko odpremo za pisanje in branje v binarnem formatu. Če datoteka z danim imenom že obstaja, jo bomo "povozili. Če pa je še ni, bomo tvorili novo. |
a |
Datoteko odpremo za dodajanje. Kazalec datoteke bo kazal na konec datoteke, če ta obstaja. Če datoteke še ni, tvorimo novo za pisanje. |
ab |
Datoteko odpremo za dodajanje v binarnem formatu. Kazalec datoteke bo kazal na konec datoteke, če ta obstaja. Če datoteke še ni, tvorimo novo za pisanje. |
a+ |
Datoteko odpremo za dodajanje in branje. Kazalec datoteke bo kazal na konec datoteke, če ta obstaja. Če datoteke še ni, tvorimo novo za branje in pisanje. |
ab+ |
Datoteko odpremo za dodajanje in branje v binarnem formatu. Kazalec datoteke bo kazal na konec datoteke, če ta obstaja. Če datoteke še ni, tvorimo novo za branje in pisanje |
Ko enkrat datoteko odpremo, lahko o njej dobimo različne podatke.
Seznam atributov objekta file je naslednji:
Atribut | Opis |
---|---|
file.closed |
Vrne True, če je datoteka zaprta. Sicer vrne False. |
file.mode |
Vrne način dostopa, s katerim je bila ta datoteka odprta |
file.name |
Vrne ime datoteke. |
# Odprimo datoteko datoteka = open("besedilo.txt", "wb") print ("Ime datoteke: ", datoteka.name) print ("Ali je zaprta : ", datoteka.closed) print ("Kako je bila odprta : ", datoteka.mode) datoteka.close() |
Po uporabi (branju ali pisanju) moramo odprto datoteko zapreti. Uporabimo metodo close(). Ta metoda prenese še morebitno nezapisane podatke in zapre objekt file. KO ke enkrat datoteka zaprta, je do ponovnega odprtja ne moremo več brati, niti ne moremo več pisati vanjo.
Zgled uporabe metode close() vidimo tudi v prejšnjem primeru.
Metoda write() piše katerikoli niz v odprto datoteko.Spomnimo se, da niz lahko vsebuje besedilo, lahko pa tudi binarne podatke.
Argument metode write() je niz, ki ga želimo zapisati v datoteko. Metoda write() ne dodaja na konec niza znaka za skok v novo vrstico ('\n').
# Odprimo datoteko fo = open("misel.txt", "w") fo.write( "Ni pomembno, kako pocasi gre\n") fo.write( "Pomembno je, da se nikoli ne ustavis\n") # Zaprimo o odprto datoteko fo.close() |
Metoda read() prebere niz iz odprte datoteke. Spomnimo se, da lahko nizi vsebujejo tako binarne podatke kot tekst.
Splošna oblika metode read() je naslednja:
fileObject.read([count]);
Posredovani parameter je število bajtov, ki jih želimo prebrati iz odprte datoteke. Če števila zahtevanih bajtov ne podamo, bo metoda poskušala prebrati čimveč bajtov, po možnosti do konca datoteke.
# odprimo datoteko (isto kot
prej) fo = open("misel.txt", "r+") niz = fo.read(17) print ("Prebrani niz : ", niz) # zaprimo odprto datoteko fo.close() |
Metoda tell() poive trenutni položaj (kazalca) v datoteki. Vsak naslednji klic read() ali write() ta položaj premakne za ustrezno število bajtov.
Metoda seek(offset[, from]) premakne ta kazalec položaja. Argument offset pove odmik, za koliko bajtov želimo premakniti kazalec. Argument from pa določa referenco, od kod štejemo odmik.
e je from nastavljen na 0, uporabljamo kot referenčni položaj začetek datoteke. Če je from nastavljen na 1, je referenčni položaj kar trenutni položaj kazalca. Če je from enak 2, jemljemo kot referenco za odmik konec datoteke.
#Odpri datoteko fo = open("misel.txt", "r+") str = fo.read(17) print ("Prebrano : ", str) # Preveri trenuten polozaj polozaj = fo.tell() print ("Trenutni polozaj v datoteki : ", polozaj) # Prestavi kazalec spet na zacetek datoteke polozaj = fo.seek(0, 0) str = fo.read(11) print ("Ponovno prebrano : ", str) #Zapri odprto datoteko fo.close() |
V tem primeru bi na zaslonu dobili naslednji izpis:
Prebrano : Ni pomembno, kako
Trenutni polozaj v datoteki : 17
Ponovno prebrano : Ni pomembno
Vse datoteke so pomnjene v različnih mapah (direktorijih). Python zmore rokovanje z datotekami in direktoriji. Je pa to stvar uporabljenega operacijskega sistema. Zato uvozimo modul os in z njim lahko datoteke preimenujemo ali celo brišemo in direktorije tvorimo, brišemo, spreminjamo.
Metoda rename() ima dva argumenta. Prvi je staro ime datoteke, drugi je novo ime.
import os # preimenovanje datoteke staroIme.txt v novoIme.txt os.rename( "staroIme.txt", "novoIme.txt" ) |
Z metodo remove() brišemo datoteko, katere ime je podano kot argument te metode.
import os # brisanje datoteke test.txt os.remove("test.txt") |
Metoda mkdir() , ki se nahaja v modulu os , omogoča tvorbo direktorija v tekočem direktoriju. V metodi moramo kot argument podati ime tvorjenega direktorija.
import os # Tvorba direktorija "test" os.mkdir("test") |
Uporabimo metodo chdir(), v kateri navedemo ime direktorija, ki naj bi postal naš tekoči direktorij.
import os # Sprememba tekočega direktorija os.chdir("/home/newdir") |
Ta metoda prikaže tekoči direktorij.
Metoda rmdir() briše direktorij, ki je podan kot argument metode. Pred brisanjem tega direktorija je zbrisana vsa njegova vsebina.