Göm meny

Lektion inför Temauppgift 2

På lektionen för Tema 2 ska jobba med att läsa in data från filer samt jobbar med data som lästs in till listor.

Jobba med filer

Nedan hittar du materialet om textfiler. Rekommendationen är att ni gjort minst övningarna 0-3 innan ni börjar med Del 2 på Temauppgift 2.

Textfiler att använda under lektionen

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 /courses/729G46/kursmaterial/lektion2.

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

Filer att hämta via webben istället för via kurskatalogen:

Högerklicka på länkarna och välj “Spara som…”.

Introduktion till att jobba med textfiler

Läsa data från fil

Det finns olika sätt att läsa in data från en fil i python. Vi kommer i denna övning att använda oss av metoden readlines(), som läser hela filen och sparar innehållet i en lista av strängar.

Innan vi kan läsa från en fil, så måste vi öppna filen för läsning med hjälp av funktionen open(). När vi har öppnat en fil så läser vi den med hjälp av metoden readlines().

Du kan läsa pythondokumentationen för readlines() översiktligt. Du behöver inte förstå allt, men du får exempel på den terminologi som används. Vissa termer kommer kanske att vara nya. Vad betyder t.ex. EOF?

Exempel

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

# Vi använder metoden readlines() vars returvärde vi sparar i variabeln
# file_contents. readlines() returnerar filens innehåll som en lista av strängar
# där varje sträng är en rad i filen.
file_contents = open_file.readlines()

# När vi inte behöver den öppna filen längre stänger vi den (det inlästa
# innehållet ligger ju i file_contents)
open_file.close()

# Vi kan nu använda t.ex. en for-loop för att gå igenom innehållet
for line in file_contents:
    # kod som gör saker
    pass

Andra sätt att läsa från fil

Om ni vill kan ni bekanta er med dokumentationen för metoderna read() och readline():

Skriva till fil

Om vi vill skriva till en fil måste vi öppna filen i skrivläge. För att öppna en fil i skrivläge skickar vi med strängen "w" som andra argument till open(). Sedan använder vi metoden .write() för att skriva strängar till filen. När vi är klara stänger vi filen.

Exempel

# öppna fil i skrivläge
save_file = open("saved_data.txt", "w")

# skriv till fil
save_file.write("Remember this:")

# stäng filen
save_file.close()

OBS! När vi öppnar en fil i skrivläge skriver vi över allt innehåll i filen. Om vi vill lägga till information till en fil måste den öppnas i “lägg till-läge” ("append mode"). Istället för strängen "w" skickar vi ett "a":

# öppna fil i lägg till-läge
save_file = open("saved_data.txt", "a")

# skriv till fil
save_file.write("INABIAF")

# stäng filen
save_file.close()

(It’s not a bug, it’s a feature)

Övningar med filer

Övningarna är förberedelser inför Del 2 av Temauppgift 2. De behöver inte lämnas in. Rekommendationen är att göra minst Övning 0-3 innan du börjar på Del 2 på Temauppgift 2.

Praktiska strängmetoder att känna till

  • str.strip() returnerar en ny sträng där alla osynliga tecken (radbryt, tab, mellanslag) i början och slutet av den ursprungliga strängen tagits bort
  • str.rstrip() som str.strip() fast tar bara bort osynliga tecken från slutet (högra) sidan av den ursprungliga strängen.
  • str.lstrip() som str.strip() fast tar bara bort osynliga tecken från början (vänstra) sidan av den ursprungliga strängen.
  • str.split(sep) returnerar en lista som innehåller ursprungssträngen uppdelad i enskilda element med hjälp av en separator. Se str.split.
  • str.join(lista) returnerar en sträng som bildats genom att slå ihop alla element i listan lista. Elementen måste vara strängar och kommer att skiljas åt i den returnerade strängen av den strängen som metoden anropas på. Se str.join.

Övning 0: Läs från fil

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

  1. Öppnar filen firstnames
  2. Använder readlines() 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 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: Vilket förnamn hör till efternamnet?

Skriv funktionen ovn6() som tar in ett efternamn som ett argument (som en sträng) och returnerar det första förnamnet på den första personen med det angivna efternamnet i scientists.csv.

Tips: Strängmetoden str.split() är användbar för att separera för- och efternamn. Kom ihåg att efternamn kan ha mellanslag!

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: 2021-09-08