Python 3/Tiedosto
Tiedoston avaaminen
[muokkaa | muokkaa wikitekstiä]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 | muokkaa wikitekstiä]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 | muokkaa wikitekstiä]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 | muokkaa wikitekstiä]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 | muokkaa wikitekstiä]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 | muokkaa wikitekstiä]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 | muokkaa wikitekstiä]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 | muokkaa wikitekstiä]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 | muokkaa wikitekstiä]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 | muokkaa wikitekstiä]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 | muokkaa wikitekstiä]- 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: |