Göm meny

TU Lektion 2

I lektionen för tema 2 kommer vi gå igenom hur man läser in data från filer samt jobbar med data som lästs in till listor.

Lösningsexempel till vissa av uppgifterna hittar ni här: Lektion 2 på trinket.io

Datafiler

Du kommer att använda två datafiler till övningarna i denna lektion. Börja därför med att kopiera dem från kurskatalogen. Du hittar filerna firstnames och lastnames i katalogen ~729G74/kursmaterial/lektion2.

Filen firstnames innehåller förnamn och filen lastnames innehåller efternamn.

Övning 0: Läsa data från fil

Det finns olika sätt att läsa in data från en fil i python. Vi ska i denna övning använda oss av while-loopen, villkor och break-satsen. Om man skriver break innuti en loop, så hoppar programmet ut ur loopen.

Innan vi kan läsa från en fil, så måste vi öppna filen för läsning med hjälp av open. När vi har öppnat en fil kan vi använda någon av de olika läs-metoderna på filen:

Läs ovanstående länkar till pythondokumentationen för read(), readline(), och readlines() översiktligt. Du behöver inte förstå allt, men du får exempel på den terminologi som används. Mycket bör du känna igen, men vissa termer kommer kanske att vara nya. Vad betyder t.ex. EOF?

Nedanstående kodexempel visar hur filen experiment-data öppnas med open() och hur metoden read() sedan används på den öppna filen. När vi är klara med filen stänger vi den med metoden close().

# vi öppnar filen och använder variabeln open_file för att referera till den
open_file = open("experiment-data")

# vi använder metoden read() var returvärde vi sparar i variabeln file_contents
# baserat på din läsning av dokumentationen för read(), vad bör file_contents
# innehålla? 
file_contents = open_file.read()
open_file.close()

Övning 0a

Skriv funktionen ovn_0a() som gör följande:

  1. Öppnar filen firstnames
  2. Använder read() på den öppna filen och sparar dess returvärde till en variabel.
  3. Stänger filen.
  4. Skriver ut innehållet i variabeln du sparade resultatet till.
  5. Se till att du förstår varför du fick det innehåll du fick!

Tips 1: För att se radbryt etc i en sträng, kan du använda funktionen repr(). Nedanstående kod kommer att skriva ut strängen "hej\nhopp\n" utan att konvertera \n tecknena till faktiska radbryt.

print(repr("hej\nhopp\n"))

Tips 2: I och med att datafilerna är textfiler, så kan du öppna dem och se deras innehåll i din texteditor.

Övning 0b

Skriv funktionen ovn_0b() som gör samma sak som ovn_0a(), men som använder metoden readline() istället för read().

Övning 0c

Skriv funktionen ovn_0c() som gör samma sak som ovn_0a(), men som använder metoden readlines() istället för read().

Övning 0d

Skriv funktionen ovn_0d() som gör samma sak som ovn_0a(). Innan du skriver ut innehållet som du läst från filen, tillämpa metoden split() med argumentet "\n" på variabeln som har filinnehållet. Exempel:

open_file = open("firstnames")
file_contents = open_file.read()
file_contents = file_contents.split("\n")
print(repr(file_contents))

Vad gör metoden split()?

Övning 1: Ett sätt att räkna rader i en fil

Skriv funktionen ovn1() som läser in filen firstnames och lagrar dess innehåll i en lista där varje rad i filen ligger som en sträng i en lista.

Funktionen ska sedan returnera antalet rader som filen innehöll.

Övning 2: Vilka efternamn börjar på “C”?

Skriv funktionen ovn2() som läser in filen lastnames och skriver ut alla efternamn som börjar på bokstaven C.

Övning 3: Slå ihop för- och efternamn och spara som CSV-fil

Skriv funktionen ovn3() som läser in filen firstnames till en lista och lastnames till en annan lista.

Funktionen ska sedan skapa en ny lista, full_names där varje listelement är en sträng på formen "förnamn,efternamn".

Till sist ska funktionen spara innehållet i listan full_names som en CSV fil med filnamnet scientists.csv. Nedan ser du filen scientists.csv som den ska se ut.

Marie,Curie
Ida,Noddack
Maria,Goeppert-Mayer
Sofia,Vasiljevna Kovalevskaja
Rosalind,Franklin
Cecilia,Payne-Gaposchkin
Jocelyn,Bell Burnell
Dorothy,Crowfoot Hodgkin
Ada,Lovelace
Barbara,McClintock
Grace,Hopper

Tips 1: För att ta bort ett radbryt och andra whitespace-tecken i slutet av en sträng kan du använda strängmetoden rstrip(). Exempel:

# en sträng med radbryt i slutet
line = "hejsan\n"

# nedanstående tar bort radbrytet i slutet på strängen
line = line.rstrip()

Tips 2: För att skriva till en fil, öppnar du filen i skrivläge (se open) och använder sedan metoden write(string_value). Glöm inte att stänga filen efteråt. Exempel:

open_file = open("test", "w")
open_file.write("När man använder write måste man skriva alla radbryt explicit.\n")
open_file.write("Annars ")
open_file.write("hamnar allt på samma rad.\n")
open_file.write("Det sista tecknet i en textfil bör vara ett radbryt.\n")
open_file.close()

Övning 4: Läsa CSV-fil och ta bort kommatecken

Skriv funktionen ovn4() som ska läsa in filen scientists.csv som du skapade i förra övningen så att varje person (dvs "förnamn,efternamn") blir ett eget listelement.

Gå sedan igenom listan med en while-loop och byt ut kommatecknet i varje element mot ett mellanslag.

Returnera den omgjorda listan.

Tips: I denna Övning är det tillåtet att använda strängmetoden str.replace()

Övning 5: Var finns Ada?

Ada Lovelace brukar kallas världens första programmerare. Skriv funktionen ovn5() som letar fram vilken rad som “Ada Lovelace” finns på i filen scientist.csv.

Funktionen ovn5() ska använda funktionen ovn4() du skrev i förra övningen för att ladda in namnen från scientists.csv.

Övning 6: Hur långt är person nummer 3:s förnamn?

Skriv funktionen ovn6() som returnerar antalet bokstäver som personen på rad 3 i scientists.csv har i sitt förnamn.

Extra övningar

Skriv funktioner som löser följande övningar.

  1. Skriv en funktion som kan plocka fram alla förnamn som innehåller ett visst antal bokstäver. Skicka in antalet bokstäver som ett argument.
  2. Skriv en funktion som plockar fram det längsta namnet.
  3. Skriv en funktion som plockar fram det kortaste namnet.
  4. Skriv en funktion som skapar slumpmässiga namn genom att använda filerna med förnamn och efternamn.
  5. Skriv en funktion som gör om alla namn till gemener (Tips: strängmetoden str.lower())
  6. Skriv en funktion som kan klura ut om ett namn är ett palindrom eller inte.


Sidansvarig: Jody Foo
Senast uppdaterad: 2017-10-27