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ä.