Datan lukeminen ja kirjoittaminen

Luodaan tiedosto halogeenit.txt, joka sisältää halogeenien symbolit:

halogeenit = ['F', 'Cl', 'Br', 'I']
tiedosto = open("halogeenit.txt", "w")
for halogeeni in halogeenit:
    # Kirjoitetaan jokainen symboli omalle rivilleen (\n on rivinvaihto)
    tiedosto.write(halogeeni + "\n")
# Lopuksi suljetaan tiedosto!
tiedosto.close()

Luetaan seuraavaksi juuri luomamme tiedoston sisältö rivi kerrallaan for-silmukan avulla:

halogeenit1 = []
halogeenit2 = []
tiedosto = open("halogeenit.txt", "r")
for rivi in tiedosto:
    halogeenit1.append(rivi)
    # str.rstrip()-funktio poistaa rivinvaihdon rivin lopusta
    halogeenit2.append(rivi.rstrip())

# Suljetaan tiedosto!
tiedosto.close()
    
print(halogeenit1)
print(halogeenit2)

Koodi tulostaa:

['F\n', 'Cl\n', 'Br\n', 'I\n']
['F', 'Cl', 'Br', 'I']

Eli str.rstrip-funktiolla päästin eroon tiedostossa olleista rivinvaihtomerkistä, jotka Python sisällyttää lukemiinsa riveihin.

str.split-funktion hyödyntäminen

Luodaan tiedosto neliot.txt, joka sisältää numerot 1-100 ja niiden neliöt välilyönnillä erotettuna. Tiedoston rakenne on siis (kolme ensimmäistä riviä):

1 1
2 4
3 9

Huomaa, miten str.format-funktiota voi hyödyntää myös tiedostoon kirjoitettaessa:

tiedosto = open("neliot.txt", "w")
for i in range(1, 101):
    tiedosto.write("{:d} {:d}\n".format(i, i * i))
tiedosto.close()

Avataan luotu tiedosto lukemista varten ja hyödynnetään aiemmin kierroksella 3 mainittua str.split-funktiota:

tiedosto = open("neliot.txt", "r")
for rivi in tiedosto:
    # rivi on siis merkkijono, esim. "3 9\n". Funktio str.split() palauttaa 
    # listan, johon merkkijonon sanat on pilkottu alkioiksi.
    # Jos siis rivi on "3 9\n", rivi.split() palauttaa listan ["3", "9"]
    # str.split-funktio siivoaa myös rivinvaihdot pois
    # Funktion palauttamat arvot voi lukea suoraan muuttujiin:
    luku, nelio = rivi.split()
    # Toinen vaihtoehto olisi lukea arvot listaan:
    # datat = rivi.split() # datat[0] == luku ja datat[1] == nelio

    # Luvut ovat nyt edelleen merkkijonoina. Ne voisi muuntaa 
    # kokonaisluvuiksi int()-funktiolla, mutta nyt riittää tulostus
    print("Luvun", luku, "nelio on", nelio)
tiedosto.close()

Koodi tulostaa (vain kolme ensimmäistä ja kolme viimeistä riviä näkyvissä):

Luvun 1 neliö on 1
Luvun 2 neliö on 4
Luvun 3 neliö on 9
...
Luvun 98 neliö on 9604
Luvun 99 neliö on 9801
Luvun 100 neliö on 10000

Numeroarvojen lukeminen tiedostosta

Meillä on käytössämme datatiedosto moolimassat.txt, joka sisältää kullakin rivillä yhdisteen nimen, moolimassan (g/mol) ja massan (g) välilyönnillä erotettuna (tiedoston kaksi ensimmäistä riviä):

H2O  18.015 2.3
NaCl 58.44  4.5

Luetaan nyt tiedoston sisältö niin, että voimme hyödyntää lukuarvoja laskennassa

tiedosto = open("moolimassat.txt", "r")
for rivi in tiedosto:
    datat = rivi.split()
    # datat on nyt kolmen merkkijonon lista, esim.: [H2O, 18.015, 2.3]
    nimi = datat[0]
    moolimassa = float(datat[1])
    massa = float(datat[2])
    ainemaara = massa / moolimassa
    print("Yhdisteen {} ainemaara on {:4.3f}".format(nimi, ainemaara))

# Lopuksi suljetaan tiedosto
tiedosto.close()

Koodi tulostaa (vain kolme ensimmäistä riviä näkyvissä):

Yhdisteen H2O ainemaara on 0.128
Yhdisteen NaCl ainemaara on 0.077
Yhdisteen KF ainemaara on 0.114
...

Toinen esimerkki numeroarvojen lukemisesta

Meillä on käytössämme datatiedosto temps.txt, joka sisältää kullakin rivillä alkuaineen symbolin, nimen, sulamispisteen (°C) ja kiehumispisteen (°C). Tiedoston kaksi ensimmäistä riviä:

Sc, skandium   , 1541.0 ,2830
Ti  , titaani  , 1668.0,3287

Huomaa, että tiedot ovat nyt pilkulla eroteltuna ja sisältävät ylimääräisiä välilyöntejä. Luetaan nyt tiedoston sisältö hyödyntämällä str.split-funktion sep-parametriä, jolla voi määrätä datapisteiden välisen erottimen. Lisäksi tarvitsemme str.strip-funktiota ylimääräisten välilyöntien poistamiseen.

metallit = []
tiedosto = open("temps.txt", "r")
for rivi in tiedosto:
    datat = rivi.split(sep = ',')
    # datat on nyt neljän merkkijonon lista, esim.: ["Sc", " skandium   ", "1541.0 ", "2830"]
    # Käytetään lisäksi str.strip()-funktiota, joka karsii tyhjät merkit 
    # (välilyönnit, rivinvaihdot) merkkijonon vasemmalta ja oikealta puolelta. 
    # esim "  testi  \n".strip() -> "testi"
    symboli = datat[0].strip()
    nimi = datat[1].strip()
    # sulamispiste ja kiehumispiste liukulukuina. str.strip()-funktiota ei tarvita, 
    # float osaa jättää ylimääräiset välilyönnit huomioimatta
    sulamispiste = float(datat[2])
    kiehumispiste = float(datat[3])
    
    print("Alkuaineen {:2s} sulamispiste on {:4.0f} C " 
          "ja kiehumispiste {:4.0f} C".format(symboli, sulamispiste, kiehumispiste))

# Lopuksi suljetaan tiedosto!
tiedosto.close()

Koodi tulostaa (vain kolme ensimmäistä riviä näkyvissä):

Alkuaineen Sc sulamispiste on 1541 C ja kiehumispiste 2830 C
Alkuaineen Ti sulamispiste on 1668 C ja kiehumispiste 3287 C
Alkuaineen V  sulamispiste on 1910 C ja kiehumispiste 3407 C
...