Ez az összefoglaló bemutatja a Pythonban történő szöveges fájlkezelés alapjait: fájl megnyitása, olvasás, írás, kódolás kezelése, fájlmódok, a with kontextuskezelő használata, valamint néhány gyakori mintázat és hibakezelés.
open()A beépített open(path, mode='r', encoding=None, errors=None, newline=None) függvénnyel nyitunk fájlokat.
| Paraméter | Leírás |
|---|---|
path | Fájlnév vagy elérési út (string vagy pathlib.Path). |
mode | Megnyitási mód (pl. 'r','w','a','x','b','t','+' — lásd lent). |
encoding | Karakterkódolás (pl. 'utf-8'). Text módban ajánlott megadni. |
errors | Hibakezelés kódolási/ dekódolási problémákra ('strict','ignore','replace'). |
newline | Újsor kezelése (None — univerzális; '\n', '\r\n' stb.). |
'r' — olvasás (alapértelmezett).'w' — írás (létező fájl felülíródik).'a' — hozzáfűzés (append).'x' — exkluzív létrehozás (hiba, ha már létezik).'b' — bináris mód (pl. 'rb', 'wb').'t' — text mód (alapértelmezett).'+' — olvasás+írás (pl. 'r+', 'w+').with kontextuskezelőA with automatikusan bezárja a fájlt akkor is, ha kivétel történik — ez a legbiztonságosabb mód.
from pathlib import Path
# Olvasás
with open('pelda.txt', 'r', encoding='utf-8') as f:
tartalom = f.read()
# Írás (felülírja a fájlt)
with open('pelda_out.txt', 'w', encoding='utf-8') as f:
f.write('Els\u0151 sor\n')
# Hozz\u00e1f\u0171z\u00e1s
with open('pelda_out.txt', 'a', encoding='utf-8') as f:
f.write('Masodik sor\n')
f.read(size=-1) — az egész fájl (vagy legfeljebb size bájt/karakter).f.readline() — egy sor olvasása (újsor megtartva).f.readlines() — a fájl sorainak listája (nagy fájloknál memóriagazdaságtalan).
for line in f: — memóriabarát és ajánlott soronkénti feldolgozáshoz.# Soronkénti olvasás memóriatakarékosan
with open('nagy_fajl.txt', 'r', encoding='utf-8') as f:
for line in f:
process(line.strip())
# R szleges olvasás (pl. 1024 karakter)
with open('nagy_fajl.txt', 'r', encoding='utf-8') as f:
chunk = f.read(1024)
while chunk:
process(chunk)
chunk = f.read(1024)
f.write(string) — visszaadott érték: írt karakterek száma.f.writelines(iterable) — több sor egyszerre (nem ad automatikus újsort).f.flush() — kiüríti a belső puffer tartalmát a lemezre.os.fsync(f.fileno()) — garantálja az operációs rendszerhez történő kiírást (ha szükséges).
lines = ['els\u0151 sor\n', 'masodik sor\n']
with open('kimenet.txt', 'w', encoding='utf-8') as f:
f.writelines(lines)
f.flush()
# import os; os.fsync(f.fileno()) # ha tényleg biztosra akarunk menni
Text módban a open() alapértelmezettként dekódol/enkódol. Mindig érdemes explicit encoding='utf-8'-at használni (különösen többnyelvű adatoknál). Ha nem adunk meg kódolást, a rendszer alapértelmezettje lesz, ami platformfüggő lehet.
errors='strict' — alapértelmezett, kivételt dob hibás byte esetén.errors='ignore' — kihagyja a hibás byte-okat.errors='replace' — helyettesíti a hibás byte-okat egy helyőrző karakterrel.Újsorok: A newline=None (alapértelmezett) univerzális új sor-kezelést biztosít — Python automatikusan kezeli a \n, \r\n, és \r variánsokat olvasáskor.
Ha bináris adatot (képek, tömörített fájlok stb.) kezelünk, használjuk a 'b' módot ('rb','wb'). Bináris módban read() bytes-t ad vissza (nem str), és nem történik kódolás/újsor normalizálás.
Néhány példa, amelyre érdemes figyelni:
FileNotFoundError — próbálunk olvasni egy nem létező fájlt.PermissionError — nincs jogosultság a művelet végrehajtásához.encoding megadása.try:
with open('adat.txt', 'r', encoding='utf-8') as f:
data = f.read()
except FileNotFoundError:
print('A fajl nem letezik')
except PermissionError:
print('Nincs jogosultsag a fajl olvasasahoz')
except UnicodeDecodeError:
print('Kodolasi hiba — probald meg az encoding parametert')
pathlib használata (ajánlott)A pathlib.Path objektum kényelmes és platformfüggetlen fájlútvonal kezelést ad.
from pathlib import Path
p = Path('mappa') / 'pelda.txt'
# Olvasas
text = p.read_text(encoding='utf-8')
# Iras
p.write_text('valami\n', encoding='utf-8')
# Bináris
binp = Path('kep.png')
bytes_data = binp.read_bytes()
Nagy fájloknál ne töltsük be az egész fájlt memóriába. Használjunk soronkénti olvasást vagy chunk-olást (read(size)), esetleg memória-mappolt fájlokat (mmap) ha szükséges.
Gyakran dolgozunk strukturált szövegekkel — a csv és json modulok segítenek:
import csv, json
# CSV olvasas
with open('adat.csv', 'r', encoding='utf-8', newline='') as f:
reader = csv.reader(f)
for row in reader:
process(row)
# JSON olvasas
with open('adat.json', 'r', encoding='utf-8') as f:
obj = json.load(f)
# JSON iras
with open('kimenet.json', 'w', encoding='utf-8') as f:
json.dump(obj, f, ensure_ascii=False, indent=2)
Ha több folyamat/folyton egyszerre ír egy fájlba, szükség lehet zárolásra (file locking). Pythonban platformfüggetlen megoldás nincs beépítve — használhatod a fcntl (Unix) vagy msvcrt (Windows) modulokat, vagy külső könyvtárakat (pl. filelock).
from pathlib import Path
infile = Path('input.txt')
outfile = Path('output.txt')
with infile.open('r', encoding='utf-8') as inf, outfile.open('w', encoding='utf-8') as outf:
for line_no, line in enumerate(inf, start=1):
line = line.strip()
if not line:
continue
# egyszerű transzformáció: kisbetűsítés
new = line.lower()
outf.write(f"{line_no}: {new}\n")
with-et.encoding='utf-8'-ot, ha nem vagy biztos a platform alapértelmezésében.newline='' paramétert az open()-ban a helyes sorelválasztó kezelésért.