Osa 7

Datan käsittely

CSV-tiedoston lukeminen

Olemme tähän mennessä käsitelleet CSV-tiedostoja omalla koodilla, mutta tähän on myös valmis moduuli csv, jota voi käyttää näin:

import csv

with open("testi.csv") as tiedosto:
    for rivi in csv.reader(tiedosto, delimiter=";"):
        print(rivi)

Yllä oleva koodi lukee rivit CSV-tiedostosta testi.csv, jossa erotinmerkki on ;. Esimerkiksi jos tiedoston sisältö on

012121212;5
012345678;2
015151515;4

niin koodi antaa seuraavan tuloksen:

Esimerkkitulostus

['012121212', '5'] ['012345678', '2'] ['015151515', '4']

Mitä hyötyä on käyttää moduulia sen sijaan, että toteuttaa lukemisen itse split-funktiolla? Yksi hyöty on, että moduulin toteutus toimii myös silloin, kun arvona on merkkijono, jonka sisällä on erotinmerkki. Esimerkiksi jos tiedoston sisältö on

"aaa;bbb";"ccc;ddd"

niin koodin tulos on:

Esimerkkitulostus

['aaa;bbb', 'ccc;ddd']

Jos vain jakaisimme rivin osiin ;-merkkien kohdista, lukeminen ei toimisi oikein, koska myös merkkijonot jakaantuisivat.

JSON-tiedoston lukeminen

CSV-muodon lisäksi on olemassa muitakin koneluettavia tiedostomuotoja. Eräs näistä on erityisesti tietojen siirrossa yleisesti käytetty JSON.

JSON-tiedostot ovat tekstitiedostoja, joilla on tietty tarkka muoto. Seuraavassa esimerkkinä JSON-tiedosto kurssit.json, jossa on tietoa kursseista:

[
    {
        "nimi": "Ohjelmoinnin perusteet",
        "tunnus": "Ohpe",
        "periodit": [1, 3]
    },
    {
        "nimi": "Ohjelmoinnin jatkokurssi",
        "tunnus": "Ohja",
        "periodit": [2, 4]
    },
    {
        "nimi": "Tietokantasovellus",
        "tunnus": "Tsoha",
        "periodit": [1, 2, 3, 4]
    }
]

JSON-tiedostot näyttävät kohtuullisen tutulta Pythonin käyttäjille. Itse asiassa tiedoston sisältö vastaa Pythonin listaa, jonka sisällä on kolme sanakirjaa.

Standardikirjastossa on JSON-tiedostojen käsittelyyn moduuli json. Siinä oleva funktio loads muuttaa merkkijonona annetun JSON-datan Pythonin tietorakenteiksi. Esimerkiksi koodin

import json

with open("kurssit.json") as tiedosto:
    data = tiedosto.read()
kurssit = json.loads(data)
print(kurssit)

tulos on seuraava:

Esimerkkitulostus

[{'nimi': 'Ohjelmoinnin perusteet', 'tunnus': 'Ohpe', 'periodit': [1, 3]}, {'nimi': 'Ohjelmoinnin jatkokurssi', 'tunnus': 'Ohja', 'periodit': [2, 4]}, {'nimi': 'Tietokantasovellus', 'tunnus': 'Tsoha', 'periodit': [1, 2, 3, 4]}]

Koodia voisi jatkaa vaikka seuraavasti, jolloin koodi tulostaa jokaisen kurssin nimen:

for kurssi in kurssit:
    print(kurssi["nimi"])
Esimerkkitulostus

Ohjelmoinnin perusteet Ohjelmoinnin jatkokurssi Tietokantasovellus

Loading

Netissä olevan tiedoston hakeminen

Pythonin standardikirjaston funktion urllib.request.urlopen avulla on helppo hakea internetistä sisältöä ohjelmista käsin.

Esim. seuraava koodi tulostaa Helsingin yliopiston etusivun sisällön:

import urllib.request

pyynto = urllib.request.urlopen("https://helsinki.fi")
print(pyynto.read())

Ihmisille tarkoitetut sivut tosin eivät tulostu kovin selkeinä, mutta internetissä on myös runsaasti koneluettavaa dataa, joka on usein JSON-muodossa.

Loading
Loading
Loading

Moduulien etsiminen

Pythonin dokumentaatiosta löytyy tietoa kaikista standardikirjaston moduuleista:

Standardikirjaston lisäksi verkosta löytyy lukuisia vapaasti käytettäviä kirjastoja eri tarpeisiin. Joitakin yleisesti käytettyjä moduuleja on täällä:

Loading
:
Loading...
:
Loading...

Kirjaudu sisään nähdäksesi tehtävän.