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.