Tietokoneiden näyttöjä, joissa näkyy kuvaa automaatiolaboratorion laitteistosta. Monitoreiden takana näkyy sama laitteisto kuin kuvissa.

timohei.net / Opintojaksot / Soveltava ohjelmointi / Python-ohjelmointi /
Tiedostojen käsittely

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

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 tiedosto
Tulostaa: '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 tiedosto
Tulostaa: ['Day of Week', 'Number of Crashes'] ['Sunday', '13664'] ['Monday', '17279'] ['Tuesday', '17337'] ['Wednesday', '17394'] ['Thursday', '17954'] ['Friday', '19147'] ['Saturday', '15714']

Harjoitus 1

  1. Tee ohjelma, joka tulostaa tiedostosta crash_catalonia.csv vain kolarisarakkeen eli ko. sarakkeen otsikon ja kolareiden lukumäärät!

    Ratkaisu:
    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ä 0
    Versio, joka tulee toimeen csv-tiedoston tyhjien ja otsikkorivien kanssa:
    import 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

  2. 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!
  3. 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

  1. Tee ohjelma, joka tulostaa tiedostosta hw_small.csv luetut pituus- ja painotiedot metrisinä (cm ja kg)!
    1. vinkki: merkkijonon (str) voi muuttaa liukuluvuksi (float) funktiolla float()!
    2. 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))
  2. Muokkaa ohjelmaa niin, että se tulostaa yksittäisten pituuksien ja painojen sijasta pituuksien ja painojen keskiarvot (cm, kg) sekä mittausten lukumäärän!
  3. 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 rivi in 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"
              print(tulostus.format(pituus_cm, paino_kg))
              n += 1
          except IndexError:
              indeksiongelmia += 1
      eka_rivi = False

  tulostus = "Pituuden keskiarvo on {pituus_ka:.0f} cm "\
            "ja painon {paino_ka:.1f} kg."
  print(tulostus.format(pituus_ka = pituussumma/n, paino_ka = painosumma/n))

  if indeksiongelmia > 0:
      tulostus = "Indeksiongelmia oli {}"
  else:
      tulostus = "Ei indeksiongelmia!"
  print(tulostus.format(indeksiongelmia))

Harjoituksissa käytettävät tiedostot


Alkuperäiset tiedostot: © John Burkardt, Florida State University, Department of Scientific Computing, distributed under the GNU LPGL license.

Päivitetty 7.11.2023

<<  Edellinen
(10) Toistorakenteet
Sivu 11/17Seuraava >>
(12) Virheensietoinen ohjelmointi
© Timo Heikkinen | timo piste heikkinen at oamk piste fi