Muita asioita tiedostojen käytöstä
Usein ohjelmassa käsitellään tiedostoon tallennettua tietoa jollain tavalla, esimerkiksi tehdään siihen lisäyksiä tai poistoja. Muutetut tiedot halutaan tallentaa ohjelman seuraavaa suorituskertaa varten.
Jos käsiteltävän tiedoston koko on kohtuullinen (esimerkiksi muutama sata riviä tekstitiedostona), ei muutoksia tehdä heti suoraan tiedostoon, vaan ohjelman toiminta kannattaa suunnitella seuraavasti: Ohjelman alussa kaikki tiedostoon tallennetut tiedot luetaan sopivaan tietorakenteeseen, esimerkiksi listaan tai sanakirjarakenteeseen. Kun ohjelmassa tehdään tietoihin muutoksia, niin nämä muutokset tehdään nimenomaan tähän listaan tai muuhun käytettyyn tietorakenteeseen. Ohjelman lopussa koko lista (tai muu tietorakenne) tallennetaan tiedostoon. Tiedoston vanha sisältö siis tuhoutuu ja uusi lista kirjoitetaan aikaisempien tietojen paikalle. Tämä on huomattavasti yksinkertaisempaa kuin yrittää tehdä muutoksia keskelle tiedostoa. Jos ohjelman suoritusaika on pitkä, kannattaa toki lista tallentaa aina sopivin väliajoin, jotta sen sisältöä ei menetetä esimerkiksi ohjelman tai tietokoneen kaatuessa. Mutta tällöinkin tallennetaan koko lista kerralla, ei vain muuttuneita tietoja.
Jos käsiteltävä tiedosto on paljon laajempi, ei edellä kuvattua menettelytapaa voi noudattaa, vaan on todella kirjoitettava vain muuttuneita tietoja käsittelevä tiedoston osa kerrallaan. Näin suurten tietomäärien käsittelyssä tarvitaan kuitenkin muutenkin menetelmiä, joita ei opeteta tällä kurssilla.
Huomautus poikkeuksista tiedostojen käsittelyssä
Edellä esitetyissä esimerkeissä on selvitetty OSError
-nimisen
poikkeuksen avulla ne tilanteet, joissa ohjelma ei ole löytänyt haluttua
tiedostoa tai tiedoston lukeminen tai kirjoittaminen ei ole onnistunut
jostain muusta syystä. Jos käytössä on Pythonin versio 3.2 tai tätä
vanhempi, on syytä käyttää sen sijaan IOError
-nimistä poikkeusta.
Monissa internetin Python-esimerkeissä näkee usein käytettävän
poikkeusta FileNotFoundError
kattamaan ne tilanteet, joissa haluttua
tiedostoa ei löydy. Tämä poikkeustyyppi on OSError
-poikkeuksen
alalaji (täsmällisesti ottaen OSError
-luokan aliluokka, mutta
käsitettä aliluokka ei käydä läpi tällä kurssilla).
FileNotFoundError
-poikkeus kattaa kuitenkin vain sen virhetilanteen,
että haluttua tiedostoa ei löydy. OSError
-poikkeus kattaa selvästi
enemmän tiedostojen lukemiseen ja kirjoittamiseen liittyviä
virhetilanteita, esimerkiksi sellaisen, että tiedosto on kyllä olemassa,
mutta ohjelman käyttäjän oikeudet eivät riitä sen lukemiseen tai sen,
että tiedostoon kirjoittaminen ei onnistu siksi, että levytila on
täynnä.