Python 3/Tiedosto
Tiedoston avaaminen
muokkaaTiedosto 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
muokkaaTiedostoa 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
muokkaaread 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
muokkaaMetodi 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
muokkaareadline 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
muokkaaTiedostoon 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
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, 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
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: |