2.27. Olvasás és írás¶
A fájlok a lemezen élnek; a Python az open() függvényen keresztül éri el őket, amely egy fájlobjektumot ad vissza, amelynek metódusai olvassák és írják az alatta lévő byte-okat.
2.27.1. open és módok¶
Az első argumentum az útvonal; a második a mód – egy rövid sztring, amely megmondja a Pythonnak, hogyan lesz használva a fájl:
"r"– olvasás (alapértelmezett). Egy meglévő fájlt nyit meg olvasásra."w"– írás. Új fájlt hoz létre, vagy egy meglévőt üresre csonkít."a"– hozzáfűzés. Egy fájlt nyit meg írásra a végén, csonkítás nélkül."b"a fentiek bármelyikéhez fűzve ("rb","wb","ab") – bináris mód. A fájl tartalmabytesleszstrhelyett.
f = open("notes.txt", "r")
text = f.read()
f.close()
2.27.2. Használj kontextuskezelőt¶
A fenti minta elszivárogtatja a fájlleírót, ha az open() és a close között bármi kivételt vált ki. A megoldás a with utasítás (lásd: kontextuskezelők):
with open("notes.txt") as f:
text = f.read()
# f is closed here, even if read() failed
Ez a szabványos forma – mindig így írd meg.
2.27.3. Olvasás¶
A fájlobjektumok többféle olvasási stílust támogatnak:
io.IOBase.read()– beolvassa az egész fájlt (vagy N byte-ot), és egyetlen sztringként (vagy bytes objektumként) adja vissza.io.IOBase.readline()– beolvas egy sort, beleértve a lezáró"\n"karaktert.A fájl közvetlen iterálása egyesével adja vissza a sorokat, sokkal kisebb memóriahasználattal, mint az egész fájl egyszerre történő beolvasása.
with open("log.txt") as f:
for line in f:
print(line.rstrip())
A str.rstrip() eltávolítja a lezáró újsort a kiírás előtt, hogy a kimenet ne legyen dupla sorközű.
2.27.4. Írás¶
Nyisd meg a fájlt "w" módban, és használd az io.IOBase.write() metódust:
with open("out.txt", "w") as f:
f.write("hello\n")
f.write("world\n")
Az io.IOBase.write() nem ad hozzá újsort – pontosan azokat a byte-okat (vagy karaktereket, szöveges módban) írja ki, amelyeket átadsz neki.
2.27.5. Szöveges kontra bináris¶
A szöveges mód (alapértelmezett, "r" / "w" "b" nélkül) a beérkező byte-okat egy alapértelmezett kódolással str típusra dekódolja, a kimenő str értéket pedig visszakódolja byte-okká. Használd konfigurációhoz, naplókhoz, JSON-hoz – bármihez, ami szöveg.
A bináris mód ("rb" / "wb") kihagyja a dekódolási lépést, és bytes típust ad vissza. Használd képekhez, struct-csomagolt rekordokhoz, hálózati rögzítésekhez – bármihez, ahol minden byte számít, és a fájl nem ember által olvasható.
2.27.6. Fájlok listázása és törlése¶
Az os modul teszi elérhetővé azokat a fájlrendszeri műveleteket, amelyek nem magán a fájlobjektumon vannak:
os.listdir()– egy könyvtárban lévő nevek listáját adja vissza.os.remove()– töröl egy fájlt.os.rename()– átnevez egy fájlt.os.stat()– fájl-metaadatok (méret, módosítási idő, …).os.mkdir()– létrehoz egy új könyvtárat.
import os
for name in os.listdir("/"):
print(name)
Kapd el az OSError kivételt ezek körül, amikor a fájl vagy a könyvtár esetleg nincs ott – a művelet azon gyakori helyek egyike, ahol a kivételek felbukkannak a valós szkriptekben.