2.27. Läsa och skriva

Filer ligger på disk; Python når dem genom open(), som returnerar ett filobjekt vars metoder läser och skriver de underliggande bytena.

2.27.1. open och lägen

Det första argumentet är sökvägen; det andra är läget – en kort sträng som talar om för Python hur filen ska användas:

  • "r" – läsning (standard). Öppnar en befintlig fil för läsning.

  • "w" – skrivning. Skapar en ny fil eller trunkerar en befintlig till tom.

  • "a" – tillägg. Öppnar en fil för skrivning vid dess slut utan att trunkera.

  • "b" tillagt till något av ovanstående ("rb", "wb", "ab") – binärt läge. Filens innehåll är bytes snarare än str.

f = open("notes.txt", "r")
text = f.read()
f.close()

2.27.2. Använd en kontexthanterare

Mönstret ovan läcker filhandtaget om något mellan open() och close kastar. Lösningen är with-satsen (se kontexthanterare):

with open("notes.txt") as f:
    text = f.read()

# f is closed here, even if read() failed

Detta är standardformen – skriv det så här varje gång.

2.27.3. Läsning

Filobjekt stöder flera lässtilar:

  • io.IOBase.read() – läs hela filen (eller N byte) och returnera den som en enda sträng (eller bytes-objekt).

  • io.IOBase.readline() – läs en rad, inklusive den avslutande "\n".

  • Att iterera filen direkt ger rader en i taget, med mycket mindre minnesanvändning än att läsa hela filen på en gång.

with open("log.txt") as f:
    for line in f:
        print(line.rstrip())

str.rstrip() tar bort den avslutande radbrytningen före utskrift så att utdatan inte blir dubbelt radavstånd.

2.27.4. Skrivning

Öppna filen i läget "w" och använd io.IOBase.write():

with open("out.txt", "w") as f:
    f.write("hello\n")
    f.write("world\n")

io.IOBase.write() lägger inte till en radbrytning – den skriver exakt de byte (eller tecken, i textläge) du ger den.

2.27.5. Text kontra binärt

Textläge (standard, "r" / "w" utan "b") avkodar inkommande byte till str med en standardkodning, och kodar utgående str tillbaka till byte. Använd det för konfiguration, loggar, JSON – allt som är text.

Binärt läge ("rb" / "wb") hoppar över avkodningssteget och returnerar bytes. Använd det för bilder, struct-packade poster, nätverksinfångningar – allt där varje byte spelar roll och filen inte är läsbar för människor.

2.27.6. Lista och ta bort filer

Modulen os exponerar filsystemsoperationerna som inte finns på själva filobjektet:

import os

for name in os.listdir("/"):
    print(name)

Fånga OSError runt dessa när filen eller katalogen kanske inte finns – operationen är ett av de vanliga ställena där undantag dyker upp i verkliga skript.