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.

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

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

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

#luetaan tiedoston sisältö
data = file.read()

#tulostetaan tiedoston sisältö
print data

#suljetaan tiedosto
file.close()
Tuloste
Ensimmäinen rivi.
Toinen rivi.
Kolmas rivi.

readline

muokkaa

readline palauttaa yhden rivin.

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

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

#ensimmäinen rivi
print file.readline()

#toinen rivi
print file.readline()

#suljetaan tiedosto
file.close()
Tuloste
Ensimmäinen rivi.

Toinen rivi.

readlines

muokkaa

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

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

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

#luetaan tiedoston sisältö
data = file.readlines()

#tulostetaan tiedoston sisältö
print data

#tulostetaan rivi kerralla
for i in data:
    print(i)

#suljetaan tiedosto
file.close()
Tuloste
['Ensimm\xc3\xa4inen rivi.\n', 'Toinen rivi.\n', 'Kolmas rivi.\n']
Ensimmäinen rivi.

Toinen rivi.

Kolmas rivi.

Tiedostoon kirjoittaminen

muokkaa

Tiedostoon kirjoitetaan write() funktiolla.

#!/usr/bin/python
# -*- 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, se tuhotaan.
wb Kirjoitustila Bittiarvona Jos tiedostoa ei ole, sellainen luodaan. Jos tiedosto on olemassa, jatketaan sen perään kirjoittamista.

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