Delo z datotekami

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.


Odpiranje datoteke: metoda open()

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


Atributi objekta file

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.


Primer

# 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()


Zapiranje datoteke: metoda 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.


Pisanje v datoteko: metoda write()

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').

Primer

# 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()



Branje datoteke: metoda read()

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.

Primer

# odprimo datoteko (isto kot prej)
fo = open("misel.txt", "r+")
niz = fo.read(17)
print ("Prebrani niz : ", niz)
# zaprimo odprto datoteko
fo.close()

V našem primeru bo prišlo do naslednjega izpisa na zaslon:

Prebrani niz :  Ni pomembno, kako


Položaj v datoteki

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.

Primer

#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


Delo z  datotekami in direktoriji (mapami)

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.

Preimenovanje datoteke: metoda rename()

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" )


Brisanje datoteke: metoda remove()

Z metodo remove() brišemo datoteko, katere ime je podano kot argument te metode.

Primer

import os
# brisanje datoteke test.txt
os.remove("test.txt")


Tvorba direktorija: metoda  mkdir()

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.

Primer

import os
# Tvorba direktorija "test"
os.mkdir("test")

Sprememba tekočega direktorija: metoda chdir()

Uporabimo metodo chdir(), v kateri navedemo ime direktorija, ki naj bi postal naš tekoči direktorij.

Primer

import os
# Sprememba tekočega direktorija
os.chdir("/home/newdir")


Kateri direktorij je tekoči: metoda getcwd()

Ta metoda prikaže tekoči direktorij.

Brisanje direktorija: metoda rmdir()

Metoda  rmdir() briše direktorij, ki je podan kot argument metode. Pred brisanjem tega direktorija je zbrisana vsa njegova vsebina.