Lektion 2
På lektionen går vi igenom hur man läser in data från filer till listor samt hur man kan bearbeta dessa listor.
Läs avsnitten om att läsa från och skriva till fil. Gör sedan övningarna.
Textfiler att använda under lektionen
Du kommer att använda två textfiler 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/TDDE44/kursmaterial/lektion2
.
Filen firstnames
innehåller förnamn och filen lastnames
innehåller
efternamn.
Läsa text 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 textfilen 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
|
|
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
|
|
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"
:
|
|
(It’s not a bug, it’s a feature)
Övningar
Övningarna är förberedelser inför Del 2 av Laboration 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å Laboration 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 metoden
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.
|
|
Tips 2: I och med att datafilerna är textfiler, så kan du öppna dem och se deras innehåll i din texteditor.
Frivilliga extrauppgifter
- Skriv funktionen
ovn_read()
som gör samma sak somovn_0()
, men som använder metoden.read()
istället för.readlines()
. - Skriv funktionen
ovn_readline()
som gör samma sak somovn_0()
, men som använder metoden.readline()
istället förreadlines()
.
Ö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.
|
|
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:
|
|
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:
|
|
Ö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 för 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.
- 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-01-09