Tiedoston avaaminen muokkaa

Tiedosto avataan open-funktiolla. Esimmäiseksi parametriksi annetaan tiedoston nimi. Toiseksi parametriksi mode annetaan moodi, jossa tiedosto avataan.

file = open('tiedosto.txt', 'r')

Lopuksi tiedosto pitää vapauttaa muuhun käyttöön sulkemalla se.

file.close()

Usein on parempi käyttää kontekstimanageria with-avainsanalla tiedoston avaamiseen, jolloin tiedosto suljetaan automaattisesti lohkosta poistuttaessa. (with-avainsanaa käsitellään tarkemmin Kontekstimanageri-luvussa.)

with open('tiedosto.txt', 'r') as file:
    # Tehdään jotain sisällöllä.
    pass

Tiedoston lukeminen muokkaa

Tiedostoa voi lukea kolmella eri tavalla.

Esimerkeissä käytettävän tiedosto.txt sisältö.

Ensimmäinen rivi.
Toinen rivi.
Kolmas rivi.

Kaikki tiedoston rivi voi myös lukea lävitse iteroimalla suoraan file-objektia.

with open("tiedosto.txt", "r") as file:
    for rivi in file:
        if not rivi:
            break
        print(rivi)

Tuloste

Ensimmäinen rivi.

Toinen rivi.

Kolmas rivi.

read muokkaa

read palauttaa koko tiedoston yhtenä merkkijonona, jos luettavien merkkien määrää ei määritetä koko tiedosto luetaan. Esimerkki:

# Avataan tiedosto
with open('tiedosto.txt', 'r') as file:
    # Luetaan tiedoston sisältö
    data = file.read()

    #tulostetaan tiedoston sisältö
    print (data)

Tuloste

Ensimmäinen rivi.
Toinen rivi.
Kolmas rivi.

readline muokkaa

Metodi readline lukee tiedostoa rivi kerrallaan.

# Avataan tiedosto
with open('tiedosto.txt', 'r') as file:
    # Ensimmäinen rivi
    print(file.readline())

    # Toinen rivi
    print(file.readline())

Tuloste

Ensimmäinen rivi.

Toinen rivi.

readlines muokkaa

readline palauttaa tiedoston listana. Listassa jokainen rivi on omassa alkiossa. Esimerkki:

with open('tiedosto.txt', 'r') as file:
    # Luetaan tiedoston sisältö
    data = file.readlines()

    # Tulostetaan luettu taulukko
    print(data)

    # Tulostetaan rivi kerralla
    for rivi in data:
        print(rivi)

Tuloste

['Ensimmäinen rivi.\n', 'Toinen rivi.\n', 'Kolmas rivi.\n']
Ensimmäinen rivi.

Toinen rivi.

Kolmas rivi.

Sekä readline että readlines jättävät rivinvaihtomerkin ('\n') rivin loppuun. Merkin voi poistaa esimerkiksi str-tyypin rstrip-metodilla, joka poistaa annetut merkit merkkijonon lopusta tai kaikki tyhjämerkit, jos mitään ei anneta.

>>> rivi.rstrip('\n')
'Ensimmäinen rivi.'

Huomaa, että rivinvaihtomerkkinä on aina '\n' käyttöjärjestelmästä riippumatta, koska kaikki eri rivinvaihtokäytännöt ('\n', '\r\n' ja '\r') muutetaan sisäisesti tähän muotoon, kun tiedosto avataan 'r'-moodissa.

Tiedostoon kirjoittaminen muokkaa

Tiedostoon kirjoitetaan write() funktiolla.

#!/usr/bin/python3
# -*- coding: utf-8 -*-

#luodaan uusi tiedosto
file = open('tiedosto.txt', 'w')

text = "Ensimmäinen rivi.\nToinen rivi.\nKolmas rivi."

#kirjoitetaan tiedostoon
file.write(text)

#suljetaan tiedosto
file.close()

Tiedoston avaustilat muokkaa

Tiedoston avaustila määritetään open funktiossa.

open('Tiedoston nimi', 'Tiedoston avaustila')
Tila Tyyppi Käsittelee tietoa Kuvaus
r Lukutila Merkkeinä Palauttaa IOError jos tiedostoa ei löydy.
rb Lukutila Bittiarvona Palauttaa IOError jos tiedostoa ei löydy.
a Kirjoitustila Merkkeinä Jos tiedostoa ei ole, sellainen luodaan. Jos tiedosto on olemassa, jatketaan sen perään kirjoittamista.
w Kirjoitustila Merkkeinä Jos tiedostoa ei ole, sellainen luodaan. Jos tiedosto on olemassa, vanha sisältö tuhotaan ja uusi kirjoitetaan sen tilalle.
wb Kirjoitustila Bittiarvona Jos tiedostoa ei ole, sellainen luodaan. Jos tiedosto on olemassa, jatketaan sen perään kirjoittamista.

Tilat ”r” ja ”rb” eroavat siten, että ”r”-tilassa luettessa sisältö palautetaan merkkijonona (str-tyyppi) annetussa tai oletusmerkistökoodauksessa, ”rb”-tilassa se palautetaan bytes-tyyppinä. ”r”-tilassa myös rivinvaihdot palautetaan aina ”\n”-muodossa riippumatta siitä onko tiedostossa käytetty sitä vai muotoja ”\n\r” tai ”\r”.

Tiedostojen vertailu muokkaa

Esimerkeissä käytetään kahta tekstitiedostoa, joissa on useita lyhyitä rivejä. Tiedostoissa voi olla vaikka wikilinkkejä:

  • [[linkki]]
  • [[Linkki]]
# Avataan tiedosto f1.txt lukemista varten
f1 = open('f1.txt', 'r')
# Luetaan koko tiedosto merkkijonoksi s1
s1 = f1.read()
# Suljetaan tiedosto f1 - tiedosto voidaan sulkea heti kun se on luettu
f1.close()

# Tehdään samat kuin yllä
f2 = open('f2.txt', 'r')
s2 = f2.read()
f2.close()

Nyt tiedostojen sisällöt ovat muuttujien s1 ja s2 takana merkkijonoina.

Poistetut rivit muokkaa

Tarkoituksena on katsoa, mitkä rivit puuttuvat tiedostosta f2.txt mutta ovat tiedostossa f1.txt.

# Käytetään merkkijonoon split-funktiota, joka pätkii tekstin rivinvaihtojen (\n) kohdilta listaksi.
l1 = s1.split('\n')
l2 = s2.split('\n')

# Käydään l1-lista läpi alkio (i) kerrallaan.
for i in l1:
    # Jos i ei ole listassa l2 se tulostetaan ruudulle
    if i not in l2:
        print (i)

Harjoituksia:

  • Muokkaa yllä oleva näyttämään lisätyt rivit.
  • Tai muokkaa se sellaiseksi, ettei kirjainkoolla ole väliä (linkki ja Linkki olisivat sama).

Difflib muokkaa

Pythonin kirjastoon kuuluu difflib.py, jolla voi helposti vertailla kahta tiedostoa. Katsotaan, mitkä rivit on lisätty tiedostoon tai poistettu tiedostosta f2.txt.

# Tyhjä lista
l = []

# Muutetaan muuttujien nimet
newtext = s1
oldtext = s2

# Lähetetään difflibin ndiff-luokkaan oldtext ja newtext pätkittynä listoiksi.
# Käydään ndiffin palauttama merkkijono läpi rivi (line) kerrallaan.
for line in difflib.ndiff(oldtext.splitlines(), newtext.splitlines()):
     # Takaisin tulleessa merkkijonossa lisäyksien eteen on lisätty plus ja poistojen miinus.
     # Tarvitsemme vain muutetut rivit eli rivit jotka alkavat em. merkeillä.
     if line[0] in ('+', '-'):
          # Lisätään line listaan l
          l.append(line)

# Yhdistetään lista rivinvaihdoilla
diff = '\r\n'.join(l)
# Tulostetaan merkkijono diff
print (diff)

Aiheesta muualla muokkaa