timohei.net / Opintojaksot / Älykkään sähkölaitteen projekti / 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ä.
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ölleTulostaa: "Day of Week", "Number of Crashes" "Sunday", 13664 "Monday", 17279 "Tuesday", 17337 "Wednesday", 17394 "Thursday", 17954 "Friday", 19147
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ölleTulostaa: ["Day of Week", "Number of Crashes"] ["Sunday", 13664] ["Monday", 17279] ["Tuesday", 17337] ["Wednesday", 17394] ["Thursday", 17954] ["Friday", 19147]
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: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!
Ratkaisu 2: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!
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.