Lektion inför Temauppgift 2
På lektionen för Tema 2 ska ni jobba med att läsa in data från filer samt jobbar med data som lästs in till listor.
Nedan hittar du materialet om textfiler. Rekommendationen är att ni gjort åtminstone ö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 bortstr.rstrip()
somstr.strip()
fast tar bara bort osynliga tecken från slutet (högra) sidan av den ursprungliga strängen.str.lstrip()
somstr.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 listanlista
. 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:
- Öppnar filen
firstnames
- Använder
readlines()
på den öppna filen och sparar dess returvärde till en variabel. - Stänger filen.
- Skriver ut innehållet i variabeln du sparade resultatet till.
- 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.
- 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.
- Skriv en funktion som plockar fram det längsta namnet.
- Skriv en funktion som plockar fram det kortaste namnet.
- Skriv en funktion som skapar slumpmässiga namn genom att använda filerna med förnamn och efternamn.
- Skriv en funktion som gör om alla namn till gemener (Tips: strängmetoden
str.lower()
) - Skriv en funktion som kan klura ut om ett namn är ett palindrom eller inte.
Sidansvarig: Johan Falkenjack
Senast uppdaterad: 2024-07-26