Tallentaessa tietoa muuttujiin, tieto on niissä vain niin kauan kuin ohjelma pyörii. Joskus on tarpellista tallentaa tietoja tai ladata niitä jostain pysyvämmästä tietovarastosta. Näinä pysyvämpinä tietovarastoina toimivat tiedostot. Tiedostojen käyttöön Pythonissa on sisäänrakennettu funktio ja muuttuja.
Tiedostot avataan funktiolla open; funktio ottaa parametreikseen tiedoston nimen ja avaustavasta kertovan merkkijonon. Tiedostot voi avata joko lukemista "r" tai kirjoittamista "w" varten. Avattaessa lukemista varten, jos tiedostoa ei ole aiheutuu virhe. Avattaessa kirjoitusta varten, jos tiedostoa ei ole, luodaan uusi, mutta tiedoston olessa jo olemassa, vanha pyyhitään pois ja luodaan uusi tilalle.
Funktio open palauttaa tiedosto-objektin, jota voi käyttää sen metodien avulla. Tiedoston lukemiseen on käytössä read metodi, joka palauttaa tiedoston sisällön merkkijonona ja kirjoitettaessa vastaavasti write, joka ottaa parametriksi kirjoitettavan merkkijonon. Tiedosto suljetaan metodilla close.
Tässä esimerkissä on kaksi ohjelmaa, joista toinen kirjoittaa tiedostoon test_file.txt käyttäjän syöttämän merkkijonon ja toinen lukee sen ja tulostaa sen sisällön näytölle.
read.py:
file = open("test_file.txt", "r") print(file.read()) file.close() input("Paina Enter näppäintä lopettaaksesi...")
write.py:
file = open("test_file.txt", "w") s = input("Anna tekstiä tiedostoon:\n") file.write(s) file.close() input("Paina Enter näppäintä lopettaaksesi...")
Tiedoston lukuun ja kirjoitukseen on myös metodit readlines ja writelines. Metodi readlines palauttaa tiedoston sisällön listana, joka sisältää tiedoston rivit mukaan lukien rivin lopettavan rivinvaihto merkin. Vastaavasti writelines kirjoittaa sille parametrina annetun listan sisältämät merkkijonot.
Jos teksti tiedoston joutuu käymään läpi ohjelmassa, siihen voisi käyttää readlines metodia ja käydeä sen palauttama lista läpi for rakenteessa. Metodi readlines kumminkin lataa koko tiedoston kerralla muistiin ja voi sen takia olla ongelmallista isojen tiedostojen kanssa.
Tämä ohjelma käy tiedoston lines.txt, jonka sisältö on peräisin Pythonin manuaaleista rivit läpi kysyttyään käyttäjältä merkkijonoa, jota sitten etsii tiedostosta ja tulostaa tietoa, jos jotain löytyy. Tiedoston lines.txt sisältö voi toki olla jotain muutakin kuin tässä esimerkissä.
lines.txt:
mode is an optional string that specifies the mode in which the file is opened. The available modes are: Character Meaning 'r' open for reading (default) 'w' open for writing, truncating the file first if it exists 'a' open for writing, appending to the end of the file if it exists Several characters can be appended that modify the given mode: 't' text mode (default) 'b' binary mode '+' open for updating (reading and writing) 'U' universal newline mode (for backwards compatibility; should not be used in new code)
lineread.py
s = input("Anna merkkijono:\n") file = open("lines.txt", "r") L = file.readlines() file.close() line = 0 for i in L: line += 1 if s in i: print("\"%s\" rivillä %s" % (s, line)) input("Paina Enter näppäintä lopettaaksesi...")
Pythonissa tiedoston rivit voi kumminkin käydä läpi laittamalla tiedosto-objektin kokoelman sijaan for rakenteeseen. Tässä for rakenne käy rivit yksi kerrallaan läpi niinkuin readlines metodin palauttaman listan, mutta tiedostosta ladataan muistiin vain yksi rivi kerrallaan.
Tässä edellinen esimerkin ohjelma toteutettuna jälkimmäisellä tekniikalla.
s = input("Anna merkkijono:\n") file = open("lines.txt", "r") line = 0 for i in file: line += 1 if s in i: print("\"%s\" rivillä %s" % (s, line)) file.close() input("Paina Enter näppäintä lopettaaksesi...")
Tiedoston avaus voi ottaa lisämääreeksi merkin 't' tai 'b'. Ensimmäinen on vakio toiminto; se avaa tiedoston teksimuodossa. Toinen avaa tekstin binääri muodossa. Ero on, että tekstinä avattaessa tiedoston sisältöön tehdään muutoksia, koska eri käyttöjärjestelmissä on mm. erilaiset rivin lopettavat merkit, jotka muutetaan avattaessa Pythonin ymmärtämiksi merkeiksi sekaannusten välttämiseksi.
Binääri muodossa avattaessa, vastaavia muutoksia ei tehdä. Tätä avaus tapaa käytetään useimmissa ei-tekstimuotoisissa tiedostoissa, koska esim. rivinvaihtoa vastaavan bittijonon kohdatessaan tiedostoon tehtäisiin muutoksia, jotka saattaisivat vääristää tiedoston sisältöä.
Loput tiedoston avaus tavat ja lisämääreet löytyvät Pythonin manuaaleista.