CHEM-A2600 - Kemiantekniikan ohjelmointikurssi, Luento-opetus, 30.5.2022-28.8.2022
This course space end date is set to 28.08.2022 Search Courses: CHEM-A2600
Python-oppimateriaali (CHEM-A2600)
Datan lukeminen ja kirjoittaminen
Luodaan tiedosto halogeenit.txt, joka sisältää halogeenien symbolit. Voimme kirjoittaa tiedostoon käyttämällä write()-funktiota:
halogeenit = ['F', 'Cl', 'Br', 'I'] # Avataan uusi tiedosto kirjoittamista varten tiedosto = open("halogeenit.txt", "w") # Käydään halogeenit-lista läpi for-silmukan avulla for halogeeni in halogeenit: # Kirjoitetaan jokainen listan alkio omalle rivilleen (\n on rivinvaihto) # Kirjoittamiseen käytetään write()-funktiota tiedosto.write(halogeeni + "\n") # Lopuksi suljetaan tiedosto! tiedosto.close()
Luetaan seuraavaksi juuri luomamme tiedoston sisältö rivi kerrallaan. Hyödynnetään for-silmukkaa:
halogeenit1 = [] halogeenit2 = [] tiedosto = open("halogeenit.txt", "r") # Seuraava for-silmukka lukee tiedostosta rivin kerrallaan. # Silmukkamuuttuja "rivi" päivittyy jokaisella silmukan kierroksella kunnes # kaikki tiedoston rivit on luettu 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 ja f-merkkijonojen 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 f-merkkijonoja voidaan hyödyntää myös tiedostoon kirjoitettaessa:
tiedosto = open("neliot.txt", "w") for i in range(1, 101): tiedosto.write(f"{i:d} {(i * i):d}\n") 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 (\n) pois # Funktion palauttamat arvot voi lukea suoraan muuttujiin: luku, nelio = rivi.split() # Toinen vaihtoehto olisi lukea arvot listaan ja poimia ne sieltä: # datat = rivi.split() # luku = datat[0] # nelio = datat[1] # 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 alla olevat rivit (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önneillä
erotettuna. Tiedoston kaksi ensimmäistä riviä näyttävät tältä:
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(f"Yhdisteen {nimi} ainemaara on {ainemaara:4.3f} mol") # Lopuksi suljetaan tiedosto tiedosto.close()
Koodi alla olevat rivit (vain kolme ensimmäistä riviä näkyvissä):
Yhdisteen H2O ainemaara on 0.128 mol Yhdisteen NaCl ainemaara on 0.077 mol Yhdisteen KF ainemaara on 0.114 mol ...
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ä näyttävät tältä:
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. # Esimerkiksi " testi \n".strip() palauttaa "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(f"Alkuaineen {symboli:2s} sulamispiste on {sulamispiste:4.0f} C ja kiehumispiste {kiehumispiste:4.0f} C") # 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 ...
Tehtävä 5.2.1