timohei.net / Opintojaksot / Opintojaksot / Soveltava ohjelmointi / Python-ohjelmointi /
Pythonilla (kuten useimmilla muillakin ohjelmointikielillä) voidaan käsitellä tiedostoja. Tiedosto avataan ennen kuin se voidaan lukea tai kirjoittaa. Tiedosto voidaan tuhota avaamatta sitä ensin.
Tiedoston avaaminen ja lukeminen
Tiedosto avataan open()-funktiolla:
open(file, 'm', [...])
jossa
- file on avattavan tiedoston nimi polkuineen. Polku voi olla absoluuttinen tai suhteellinen. Aiheuttaa virheen OSError, jos tiedostoa ei ole (poikkeuksena tiedoston luominen 'x'-parametrilla).
- m on kirjain, jolla kerrotaan tiedoston avaamisen tapa (mode):
- 'r' - tiedosto avataan lukemista varten (oletus)
- 'w' - tiedosto avataan kirjoittamista varten
- 'x' - tiedosto luodaan; aiheuttaa virheen, jos tiedosto on jo olemassa (käytössä vasta Python 3.3:ssa)
- 'a' - tiedosto avataan kirjoittamista varten - jos tiedosto on jo olemassa, uusi sisältö lisätään tiedoston loppuun (append); jos tiedostoa ei ole olemassa, se luodaan
- '+' - tiedosto avataan päivittämistä (updating) eli lukemista ja kirjoittamista varten
- 'b' - tiedosto avataan binäärimuotoisena
- 't' - tiedosto avataan tekstimuotoisena (oletus)
- [...] muita, harvemmin tarvittavia määreitä; ks. dokumentaatio
open()-funktio avaa tiedoston ja palauttaa ns. tiedostokahvan (file handle) eli viittauksen avattuun tiedostoon. Tiedostokahva talletetaan yleensä muuttujaan, jota käytetään tiedostoa käsitellessä.
Kun tiedostoa ei enää tarvitse käsitellä, se pitää sulkea close()-funktiolla.
Tiedoston sisältö saadaan luettua read()-funktiolla.
datafile = open("crash_catalonia.csv") # Avataan tekstitiedosto crash_catalonia.csv print(datafile.read()) # Tulostetaan tiedoston sisältö näytölle datafile.close() # Suljetaan tiedostoTulostaa: 'Day of Week', 'Number of Crashes' 'Sunday', 13664' 'Monday', 17279' 'Tuesday', 17337' 'Wednesday', 17394' 'Thursday', 17954' 'Friday', 19147' 'Saturday', 15714'
csv-tiedoston lukeminen
Pythonissa on oma kirjastonsa csv-tiedostojen käsittelyyn. Kirjasto otetaan käyttöön käskyllä import.
import csv
csv-kirjastossa on useita metodeja, joista reader() lukee avatun csv-tiedoston.
import csv datatiedosto = open("crash_catalonia.csv") # Avataan tekstitiedosto crash_catalonia.csv data = csv.reader(datatiedosto) # Luetaan tiedoston sisältö csv-muotoisena for rivi in data: # Käydään yksitellen läpi csv-tiedoston rivit print(rivi) # Tulostetaan kukin rivi näytölle datatiedosto.close() # Suljetaan tiedostoTulostaa: ['Day of Week', 'Number of Crashes'] ['Sunday', '13664'] ['Monday', '17279'] ['Tuesday', '17337'] ['Wednesday', '17394'] ['Thursday', '17954'] ['Friday', '19147'] ['Saturday', '15714']
Harjoitus 1
- Tee ohjelma, joka tulostaa tiedostosta crash_catalonia.csv vain kolarisarakkeen eli ko. sarakkeen otsikon ja kolareiden lukumäärät!
Ratkaisu:Versio, joka tulee toimeen csv-tiedoston tyhjien ja otsikkorivien kanssa:import csv datatiedosto = open("csv\crash_catalonia.csv") datarivit = csv.reader(datatiedosto) for datarivi in datarivit: # Käydään läpi kaikki rivit print(datarivi[1]) # Tulostetaan kunkin rivin listan toinen jäsen -
# ensimmäinen tulostuisi indeksillä 0import csv datafile = open("csv\crash_catalonia.csv") datarivit = csv.reader(datafile) for datarivi in datarivit: try: # Kokeillaan, josko onnistuisi hakea numero print(datarivi[1]) # toisesta sarakkeesta (eli indeksin arvolla 1) # Jos numeron haussa tulee ongelmia, hypätään # ongelman mukaiseen except-kohtaan except IndexError: # Tyhjällä rivillä tulee ongelmia indeksin print("Indeksiongelma!") # kanssa, joten tulostetaan ongelmasta continue # tieto ja jatketaan for-luuppia except ValueError: # Otsikkorivillä tulee ongelmia, kun print("Numero-ongelma!") # riviltä ei löydykään numeroita. Tulostetaan continue # ongelmasta tieto ja jatketaan for-luuppia
- Muokkaa ohjelmaa niin, että sarakkeen otsikkorivin sisältö jää tulostumatta. Vinkki: lue se tiedostosta, mutta älä tulosta sitä!
Ratkaisu 1:Ratkaisu 2:import csv datatiedosto = open("csv\crash_catalonia.csv") datarivit = csv.reader(datatiedosto) rivi = 1 # Perustetaan rivilaskuri ja asetetaan se osoittamaan # ensimmäiselle riville for datarivi in datarivit: # Käydään läpi kaikki rivit if rivi > 1: # Muut kuin 1. rivi print(datarivi[1]) # tulostetaan rivi += 1 # Muista kasvattaa rivilaskuria!
import csv datatiedosto = open("csv\crash_catalonia.csv") datarivit = csv.reader(datatiedosto) eka_rivi = True # Käsitellään ensiksi eka rivi for datarivi in datarivit: # Käydään läpi kaikki rivit if not eka_rivi: # Muut kuin 1. rivi print(datarivi[1]) # tulostetaan eka_rivi = False # Muista asettaa eka_rivi-muuttuja # arvoon False!
- Tee ohjelma, joka laskee kolareiden määrän keskiarvon! Voit käyttää hyväksesi tulostuksen muotoilua w3schoolsin sivun ohjeiden mukaan, jolloin tulos näyttää esimerkiksi tältä:
Kolarilukuja oli 7 ja niiden keskiarvo on kahden desimaalin tarkkuudella 16927.00.
Vinkki: merkkijonon voi muuttaa kokonaisluvuksi funktiolla int() - esimerkiksi merkkijono "12345" muutetaan kokonaisluvuksi näin: int("12345")
Harjoitus 2
- Tee ohjelma, joka tulostaa tiedostosta hw_small.csv luetut pituus- ja painotiedot metrisinä (cm ja kg)!
- vinkki: merkkijonon (str) voi muuttaa liukuluvuksi (float) funktiolla float()!
- vinkki: muodosta ensin tulostusformaattimuuttuja ja tulosta sitä käyttäen format-funktiolla. Tässä tulostetaan pituus kokonaislukuna (eli nollan desimaalin tarkkuudella) ja paino yhden desimaalin tarkkuudella:
tulostus = "Pituus: {:.0f} cm Paino {:.1f} kg" print(tulostus.format(pituus_cm, paino_kg))
- vinkki: merkkijonon (str) voi muuttaa liukuluvuksi (float) funktiolla float()!
- Muokkaa ohjelmaa niin, että se tulostaa yksittäisten pituuksien ja painojen sijasta pituuksien ja painojen keskiarvot (cm, kg) sekä mittausten lukumäärän!
- Muokkaa ohjelmaa niin, että luettavan tiedoston nimi syötetään näppäimistöltä. Kokeile ohjelmaa tiedostolla hw_big.csv!
hw_small.csv: Pituuksien keskiarvo on 173 cm ja painojen keskiarvo 57.7 kg.
hw_big.csv: Pituuksien keskiarvo on 173 cm ja painojen keskiarvo 57.6 kg.
import csv datafile =open ("csv/hw_small.csv" ) rivit = csv.reader(datafile) indeksiongelmia = 0 pituussumma, painosumma, n = 0.0, 0.0, 0 tuumista_senteiksi = 2.54 paunoista_kiloiksi = 0.453592 eka_rivi =True for riviin rivit:if not eka_rivi:# Ekalla rivillä on vain otsikot try :# Laske pituus senteissä ja summaa: pituus_cm =float (rivi[1]) * tuumista_senteiksi pituussumma += pituus_cm# Laske paino kiloissa ja summaa paino_kg =float (rivi[2]) * paunoista_kiloiksi painosumma += paino_kg# Tulosta molemmat tulostus ="Pituus: {:.0f} cm Paino: {:.1f} kg" except IndexError : indeksiongelmia += 1 eka_rivi =False tulostus ="Pituuden keskiarvo on {pituus_ka:.0f} cm " \"ja painon {paino_ka:.1f} kg." if indeksiongelmia > 0: tulostus ="Indeksiongelmia oli {}" else : tulostus ="Ei indeksiongelmia!"
Harjoituksissa käytettävät tiedostot
- crash_catalonia.csv - Number of car crashes in Catalonia from 2000 to 2011, by day of week. There are seven records, with two values each. There is also an initial header line.
- hw_small.csv - Height and weight for 200 individuals; each record includes three values: index, height (inches), weight (pounds). There is also an initial header line.
- hw_big.csv - Height and weight for 25000 individuals; each record includes three values: index, height (inches), weight (pounds). There is also an initial header line.
Alkuperäiset tiedostot: © John Burkardt, Florida State University, Department of Scientific Computing, distributed under the GNU LPGL license.