Läsa och skriva filer
Hantera filer på disken säkert med Pythons filhanteringssatser.
Ca 55 min · del av Programmering i Python
Begrepp i lektionen
- open()
- with-sats
- read()
- write()
- readline()
Efter denna lektion kommer du att kunna öppna, läsa, skriva och stänga filer i Python på ett säkert och minneseffektivt sätt med hjälp av open() och with-satsen.
Introduktion till filhantering och open()
När ett Python-program körs lagras variabler i primärminnet (RAM). Detta minne rensas när programmet avslutas. För att spara data permanent måste vi skriva den till sekundärminnet (hårddisken) i form av filer.
I Python använder vi den inbyggda funktionen `open()` för att interagera med filer. Funktionen tar emot två huvudsakliga argument:
1. Filens sökväg (t.ex. `"data.txt"`).
2. Filläge (*mode*), vilket anger vad vi vill göra med filen.
De vanligaste fillägena är:
- `'r'` (Read / Läs): Standardläge. Öppnar filen för läsning. Om filen inte finns uppstår ett fel (`FileNotFoundError`).
- `'w'` (Write / Skriv): Öppnar filen för skrivning. Om filen redan finns skrivs hela innehållet över. Om filen inte finns skapas en ny.
- `'a'` (Append / Lägg till): Öppnar filen för skrivning, men lägger till ny data i slutet av filen utan att radera det befintliga innehållet.
Ett grundläggande (men manuellt) sätt att öppna och stänga en fil ser ut så här:
python
Öppna filen
f = open("exempel.txt", "r")
Läs innehållet
innehall = f.read()
print(innehall)
Stäng filen manuellt
f.close()
Att manuellt stänga filer med `f.close()` är dock riskabelt. Om programmet kraschar innan `close()` hinns med, kan filen förbli låst eller korrumperad.
Säker filhantering med with-satsen
För att garantera att filer alltid stängs korrekt – även om ett fel inträffar mitt i koden – använder vi i Python en context manager via nyckelordet `with`.
När du använder en `with`-sats hanterar Python stängningen av filen automatiskt så fort kodblocket under `with` har kört klart.
Strukturen ser ut på följande sätt:
python
with open("data.txt", "r") as f:
innehall = f.read()
print(innehall)
Här utanför blocket är filen garanterat stängd!
Varför är detta den bästa metoden?
1. Säkerhet: Filen stängs alltid, vilket förhindrar minnesläckor och fillåsningar.
2. Renare kod: Du behöver aldrig komma ihåg att skriva `f.close()`.
3. Felhantering: Om en krasch sker inuti `with`-blocket stängs filresursen säkert innan felmeddelandet kastas vidare.
I professionell Python-kod är `with open(...) as ...` standarden för all filhantering.
Att läsa innehåll från filer
Det finns flera olika sätt att läsa in text från en fil beroende på hur stor filen är och vad du ska göra med datan.
1. Läsa hela filen på en gång: `read()`
Metoden `f.read()` returnerar hela filens innehåll som en enda stor sträng.
python
with open("noteringar.txt", "r") as f:
text = f.read()
*Varning:* Om filen är flera gigabyte stor kommer `read()` att ta upp mycket primärminne.
2. Läsa rad för rad med en loop (Rekommenderat för stora filer)
Filobjektet i Python kan itereras direkt i en `for`-loop. Detta läser in en rad i taget i minnet:
python
with open("stordata.txt", "r") as f:
for line in f:
# strip() tar bort osynliga radbrytningar (\n) i slutet på raden
print(line.strip())
3. Läsa alla rader till en lista: `readlines()`
Metoden `f.readlines()` returnerar en lista där varje element är en rad ur filen.
python
with open("lista.txt", "r") as f:
rader = f.readlines()
rader är nu ['rad 1\n', 'rad 2\n', ...]
4. Läsa en enskild rad: `readline()`
`f.readline()` läser nästa enskilda rad från filen. Varje anrop flyttar filpekaren framåt en rad.
Att skriva till filer
För att skriva text till en fil öppnar vi den i läge `'w'` (skriva över) eller läge `'a'` (lägga till).
Metoden `write()`
Vi använder metoden `f.write(sträng)` för att skriva text till filen. En viktig detalj att komma ihåg är att `write()` inte lägger till radbrytningar automatiskt (till skillnad från `print()`). Du måste själv lägga till `\n` när du vill ha en ny rad.
python
names = ["Anna", "Björn", "Cecilia"]
with open("namn.txt", "w") as f:
for name in names:
f.write(name + "\n")
Skriva endast strängar
Filmetoder tar endast emot datatypen `str`. Om du vill skriva tal, listor eller dictionaries måste du först konvertera dem till strängar med `str()` eller formatera dem med f-strängar.
python
alder = 25
with open("user.txt", "w") as f:
# f.write(alder) <-- Detta kastar ett TypeError!
f.write(f"Ålder: {alder}\n") # Korrekt konvertering
Metoden `writelines()`
Om du har en lista med strängar kan du skriva alla på en gång med `f.writelines(lista)`. Observera att denna metod inte heller lägger till radbrytningar mellan elementen.
Hela kursen
- Variabler, datatyper och I/O
- Operatorer och logiska uttryck
- Villkorssatser
- Slingor och iteration
- Listor och sekvenser
- Tupler och mängder
- Dictionaries
- Iteration och list comprehension
- Funktionsdefinitioner och parametrar
- Variablers räckvidd (Scope)
- Moduler och Pythons standardbibliotek
- Läsa och skriva filer
- Felhantering och undantag
- Text- och databearbetning