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 ärbytessnarare änstr.
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:
os.listdir()– returnerar en lista med namn i en katalog.os.remove()– ta bort en fil.os.rename()– byt namn på en fil.os.stat()– filmetadata (storlek, ändringstid, …).os.mkdir()– skapa en ny katalog.
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.