Failide lugemine ja kirjutamine
Eelmine
Järgmine

Peatükk 8. Failide lugemine ja kirjutamine

Failiobjekti tagastab funktsioon open(). (Kasutatav ka kujul file().) Nendel funktsioonidel on võimalikud kolm argumenti: esimene on string, milleks on avatava faili nimi, teine string, mis näitab, mis moel faili avatakse, kolmas on täisarv, mis näitab, kui palju faili loetakse. Teine ja kolmas on fakultatiivsed argumendid.

>>> f=open('katsetus.txt', 'w')
>>> print f
<open file 'katsetus.txt', mode 'w' at 80a0960>

Esimene argument on string, mis sisaldab faili nime. Teine argument on samuti string, mis sisaldab tähti, millega on kodeeritud viis, kuidas failiga edasi tegutsetakse. Mood on 'r' siis kui fail avatakse ainult lugemiseks; 'w' kui fail avatakse kirjutamiseks (olemasolev fail, millel on sama nimi, kirjutatakse üle). Mood 'a' avab faili lisamiseks: andmed kirjutatakse faili lõppu. 'r+' avab faili nii lugemiseks kui kirjutamiseks. Moodi argument on fakultatiivne, kui seda ei määrata, siis avatakse fail vaikimisi lugemiseks, nagu 'r' puhul.

Windowsi ja Macintoshi masinate puhul avab 'b' faili binaarmoodis, nii on võimalikud ka moodid 'rb', 'wb', 'r+b'. Windowsis tehakse vahet teksti ja binaarfailide vahel. Realõpu märke muudetakse automaatselt, kui andmeid loetakse või kirjutatakse. Tavalise tekstifaili puhul pole sellest midagi, aga EXE või JPEG failide puhul tuleb hoolikalt jälgida 'b' kasutamist, muidu võivad sellistes failides andmed kaotsi minna.

Failiobjektide meetodid

Järgnevate näidete puhul eeldatakse, et failiobjekt f on juba loodud.

Selleks, et lugeda faili f sisu, kasutatakse f.read(). Võib sisaldada fakultatiivset täisarvulist argumenti, mis näitab, kui palju failist loetakse. Meetod loeb suuruse jagu faili ja tagastab selle sringina. Kui suurust pole määratud või on see negatiivne, siis loetakse ja tagastatakse kogu fail. Kui suurus on ette antud, siis loetakse niipalju faili baitides. Kui jõutakse faili lõppu, siis tagastatakse f.read() tühja stringi ("").

>>> f.read()
'See on kogu fail.\n'
>>> f.read()
''

Faili f meetod f.readline() loeb failist f ühe rea. Reavahetuse märk (\n) jääb stringi lõppu. Ära jäetakse ta ainult siis, kui tegemist on faili viimase reaga ja selle lõpus ei ole reavahetusmärki.

>>> f.readline()
'See on faili esimene rida.\n'
>>> f.readline()
'Faili teine rida\n'
>>> f.readline()
''

Faili f meetod f.readlines() tagastab loendi, mis sisaldab kõiki ridu failis. Kui on antud ka suvandparameeter sizehint, siis loetakse nii palju faili (baitides) ja veel niipalju, et rida saaks lõpetatud, siis tagastatakse need read. Seda kasutatakse selleks, et sirvida suuri faile ridade kaupa, ilma et peaks kogu faili korraga mällu lugema. Tagastatakse ainult tervikread.

>>> f.readlines()
['See on faili esimene rida.\n', 'Faili teine rida\n']

Teine võimalus on tekitada tsükkel üle objekti. See ei koorma mälu, on kiire ja lihtne:

>>> for line in f:
...     print line
...                
See on faili esimene rida.

Faili teine rida

Teisena toodud näide on lihtsam, kuid ei võimalda nii üksikasjalikku kontrolli. Kuna erinevad lähenemised kasutavad erinevaid viise rea puhverdamiseks, ei tohiks neid ühe ja sama faili lugemisel segamini kasutada.

Faili f meetod f.write(string) kirjutab stringi faili, tagastab None .

>>> f.write('See on katse.\n')

Selleks, et kirjutada faili ka teisi andmetüüpe, on vaja need kõigepealt konverteerida stringiks.

>>> value = ('vastus on', 42)
>>> s = str(value)
>>> f.write(s)

Faili f meetod f.tell() tagastab täisarvu, mis tähistab failiobjekti jooksvat positsiooni failis, mõõdetuna baitides faili algusest. Selleks, et muuta failiobjekti positsiooni, kasutatakse f.seek(offset, millest). Positsioon arvutatakse lisades offseti referentspunktile. Referentspunkti valib 'millest' argument. Kui 'millest' on 0, siis loetakse faili algusest; 1 kasutab jooksvat positsiooni ja 2 kasutab faili lõppu referentspunktina. Vaikimisi on 'millest' 0, seega loetakse faili algusest.

>>> f = open('katsetus.txt', 'r+')
>>> f.write('0123456789abcdef')
>>> f.seek(5)     # mine 6. baidi juurde failis
>>> f.read(1)        
'5'
>>> f.seek(-3, 2) # mine 3. baidi juurde lõpust arvates
>>> f.read(1)
'd'

Peale faili kasutamist on soovitav kutsuda meetodit f.close(), et faili sulgeda ja vabastada süsteemi ressursid, mis on seotud avatud failiga. Peale faili sulgemist ei saa seda avada enne, kui kasutada uuesti meetodit f.open().

>>> f.close()
>>> f.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ValueError: I/O operation on closed file
Eelmine
Järgmine
Esileht