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

timohei.net / Opintojaksot / Älykkään sähkölaitteen projekti / 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ä.

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

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!

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 28.8.2022

<<  Edellinen
(9) Toistorakenteet
Sivu 10/13Seuraava >>
(11) Muotoiltu tulostaminen
© Timo Heikkinen | timo piste heikkinen at oamk piste fi