Python 2/Tiedosto
Tiedoston lukeminen
muokkaaTiedostoa voi lukea kolmella eri tavalla.
Esimerkeissä käytettävän tiedosto.txt sisältö.
Ensimmäinen rivi. Toinen rivi. Kolmas rivi.
read
muokkaaread 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
muokkaareadline 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
muokkaareadline 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
muokkaaTiedostoon 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
muokkaaTiedoston 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
muokkaaEsimerkeissä 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
muokkaaTarkoituksena 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
muokkaaPythonin 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- Python-kielisen_ohjelmoinnin_perusteet (Wikiopiston opintopiirin opiskeluohjeita)
Johdanto: | |
---|---|
Tietotyypit ja tietorakenteet: |
Luvut - Merkkijonot - Lista - Monikko (tuple) - Sanakirja - Joukko (set) |
Ohjausrakenteet | |
Muut kielen rakenteet: |
Moduuli - Luokka - Funktio - Virheidenhallinta - Tiedosto |
Graafinen käyttöliittymä: | |
Harjoitustehtäviä: | |
Lisätiedot ja lähteet: |