Göm meny

Lektion 3

I lektionen för tema 3 kommer vi repetera filläsning, men nu jobba med flera filer, samt öva på nästlade loopar och användning av paket och moduler.

Filer till övningen

Du kommer att använda ett antal filer till övningarna i denna lektion. Börja därför med att kopiera dem från kurskatalogen. Du hittar filerna i katalogen ~729G74/kursmaterial/lektion3. Förrutom ett antal .csv-filer finns även filen dataplotter.py som innehåller kod du ska använda dig av som en modul.

CSV-filerna innehåller påhittad data om olika kända forskares kaffekonsumption.

Övningar

Du måste aktivera den virtuella omgivning som hör till denna lektion för att kunna genomföra övningarna:

$ source ~729G74/kursmaterial/python/tu3venv/bin/activate

Övning 0: Shellskript som tar emot argument

Ta emot argument från anrop från skalet

Argument som anges när ett pythonskript anropas från t.ex. skalet hamnar i en speciell variabel, nämligen sys.argv. För att komma åt den måste man först importera modulen sys. Själva variabeln sys.argv är en lista vars första element är namnet på det program/skript som anropades, följt av alla argument som angavs. Se exempel nedan, anta att filen heter argument.py.

#!/usr/bin/env python3

import sys

for arg in sys.argv:
    print(arg)

Anrop av ovanstående skript:


$ ./argument.py hej hoppsan fil.py
./argument.py
hej
hoppsan
fil.py

Skicka med namn på filer till ett skript

För att skicka med namn på alla filer som slutar på .csv och ligger i samma katalog som skriptet kan man skriva följande:


$ ./argument.py *.csv

Skalet kommer att expandera *.csv till en mellanslags-separerad sekvens av filnamn som matchar mönstret (Vad betyder stjärnan?).

Övning 1: Läsa in data från data fil, använda moduler

I denna övning ska du skriva ett skript som tar in ett filnamn (till en .csv-fil) som argument och läser in innehållet. Innehållet ska sedan skickas till en funktion som är definierad i en annan fil som importerats in som en modul.

Steg 1

Öppna dataplotter.py så att du kan se koden. Prova sedan att köra filen som ett skript. Vad händer? Var ligger anropet i filen?

Skapa nu ett skript som importerar filen dataplotter.py som en modul (prova import dataplotter), och sedan anropar på funktionen test() som ligger i den filen.

Vad hände förrutom att funktionen test() kördes? Varför?

Steg 2

När du fått test() att fungera, gör så att skriptet kan ta emot ett filnamn (till en .csv-fil) och läser sedan in den filen. CSV-filen ska läsas in till en lista av listor där inga radbryt, kommatecken eller andra skräptecken finns med. Varje rad i CSV-filen ska ligga som en separat lista i den yttre listan. Se exempel nedan för filen AdaLovelace.csv:


[['', 'Måndag', 'Tisdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lördag', 'Söndag'],
['8:00', '1', '1', '0', '1', '1', '0', '0'],
['9:00', '0', '0', '1', '0', '0', '1', '0'],
['10:00', '0', '0', '1', '0', '0', '1', '0'],
['11:00', '0', '0', '0', '0', '0', '0', '0'],
['12:00', '0', '0', '0', '0', '0', '0', '0'],
['13:00', '0', '0', '0', '0', '0', '0', '0'],
['14:00', '0', '0', '0', '0', '0', '0', '0'],
['15:00', '0', '0', '0', '0', '0', '0', '0'],
['16:00', '0', '0', '0', '1', '0', '2', '3'],
['17:00', '1', '1', '2', '0', '1', '1', '0'],
['18:00', '1', '0', '0', '2', '1', '1', '2']]

Dessa CSV-filer använder ett semikolon som avgränsare mellan fält (till skillnad från de vi jobbat med tidigare som använde ett kommatecken).

Steg 3

Skicka listan av listor till funktionen dataplotter.plot_coffee(). Denna funktion skapar en HTML-fil som innehåller en graf av den data du skickade till den. Öppna filen i en webbläsare för att titta på den.

Övning 3: En graf

I denna övning ska du använda bokeh-paketet för att skapa en graf likt den i Övning 2. Innan du ritar grafen behöver du förbereda datat. Tanken är att summera alla druckna kaffekoppar för varje dag så att endast en rad återstår.

Datat i exemplet i Övning 2 ska alltså bli till följande lista:

['3', '2', '4', '4', '3', '6', '5']

Steg 1

Skriv en funktion som tar in CSV-data från en av filerna från lektionen i form av en nästlad lista och returnerar en lista som innehåller summorna av antalet druckna kaffekoppar under veckan.

Steg 2

Nästa steg är att skriva en funktion som skapar en graf via bokeh. Titta på nedanstående kod (hämtad från http://bokeh.pydata.org/en/latest/docs/user_guide/plotting.html#single-lines)

# importera de funktioner vi behöver
from bokeh.plotting import figure, output_file, show

# konfigurera namn på utdatafilen
output_file("line.html")

# skapa grafen (tom just nu)
p = figure(plot_width=400, plot_height=400)

# rita ut en linje. första listan är x-koordinater, andra är y-koordinater.
# argumentet line_width anger hur bred linjen ska vara.
p.line([1, 2, 3, 4, 5], [6, 7, 2, 4, 5], line_width=2)

# skriv till fil och visa innehållet
show(p)

Om du vill kan du prova ovanstående kod i en separat fil.

Skriv en funktion som skapar en graf med en linje som visar kaffeintaget under veckan. Som X-värden kan du använda dig av siffrorna mellan 1 till 7 som får representera dagarna.

Kort om koddisposition

För att göra det lättare att hitta i koden är det bra att följa någon form av koddisposition. Nedan är en vanlig disposition som används i många språk.

  • samla alla import-satser högst upp i filen
  • ha funktionsdefinitioner ovanför anropen till funktionerna.
  • skriv gärna kommentarer

Se också till att både dina funktionsnamn och variabelnamn är döpta på ett bra sätt, dvs att de är beskrivande och reflekterar innehåll/funktion.

Övning 4: Flera linjer

Nu är det dags att rita en graf med en linje för varje forskare. För att rita en till linje i samma graf använder gör du bara ett till anrop till p.line().

Ändra skriptet så att det använder de filnamn som det får in som argument som namn på CSV-filer. För varje fil så skapar du en lista med kaffekoppssummorna. Använd en nästlad loop för att lösa detta.

När du fått ihop listan med aggregerad data från alla filer skapar du den nya grafen.


Sidansvarig: Jody Foo
Senast uppdaterad: 2016-11-21