Python — Szöveges állományok kezelése (összefoglaló)

Rövid áttekintés

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.

Fájl megnyitása — open()

A beépített open(path, mode='r', encoding=None, errors=None, newline=None) függvénnyel nyitunk fájlokat.

ParaméterLeírás
pathFájlnév vagy elérési út (string vagy pathlib.Path).
modeMegnyitási mód (pl. 'r','w','a','x','b','t','+' — lásd lent).
encodingKarakterkódolás (pl. 'utf-8'). Text módban ajánlott megadni.
errorsHibakezelés kódolási/ dekódolási problémákra ('strict','ignore','replace').
newlineÚjsor kezelése (None — univerzális; '\n', '\r\n' stb.).

Fájl módok röviden

Ajánlott minta: 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')

Olvasási módszerek

# 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)

Írási módszerek

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

Kódolás és új sor karakterek

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.

Ú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.

Bináris vs. szöveges mód

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.

Gyakori hibák és kivételkezelés

Néhány példa, amelyre érdemes figyelni:

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ájlok és memória

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.

Speciális formátumok: CSV és JSON

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)

Versenyhelyzetek és többfolyamatú hozzáférés

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).

Összefoglaló mintapélda — fájl feldolgozás

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")

További tippek