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 tartalma bytes lesz str helyett.

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:

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.