# Fájlkezelés, mappák

Bognár Márton, Czirkos Zoltán · 2023.01.13.

A fájlkezelésről néhány szó: fájlok létrehozása, írása és olvasása Python nyelven. Ez az írás csak egy rövid segédlet azoknak, akik használni szeretnének fájlokat valamilyen feladatban; az előadáson részletesen is van szó a témáról.

### Fájl megnyitása

Pythonban nagyon egyszerű a szövegfájlok kezelése. Fájlok megnyitására az `open()` függvényt használhatjuk, amely egy fájl objektumot ad vissza. Első paraméterként a megnyitandó fájl nevét veszi át. Második paraméterként megadhatjuk a megnyitás módját. Ez lehet olvasás: `'r'`, írás: `'w'`, vagy hozzáfűzés: `'a'`. Az alapértelmezett érték az olvasás, azaz `'r'`.

### Fájl létrehozása

Fájlba írni a fájl objektum `write()` függvényével lehet, ez hasonlóan működik a már ismert `print()` függvényhez. Arra azonban figyelni kell, hogy a `write()` függvénynek csak egy string paramétere lehet, tehát ha egy sorban több változó értékét akarjuk kiírni, konkatenálást vagy string formázást kell alkalmaznunk.

    a = 5
    f = open('hello.txt', 'w')
    f.write('A változó értéke: {}\n'.format(a))
    f.close()

Fontos, hogy a fájl objektumot dolgunk végeztével le is kell zárni, erre szolgál a `close()` függvény.

Ezt egyszerűbben is írhatjuk a `with` kulcsszó segítségével, amely automatikusan kezeli az erőforrások bezárását a blokk végén:

    with open('hello.txt', 'w') as f:
        f.write('Ez egy új sor lesz.\n')

### Fájl beolvasása

Ha a fájl teljes tartalmát egyszerre szeretnénk kiolvasni, azt megtehetjük a `read()` függvénnyel.

    with open('hello.txt') as f:
        szoveg = f.read()

Sokszor inkább arra van szükségünk, hogy soronként olvassuk be a fájlt. Erre a `readline()` függvény használható, vagy egyszerűen a fájl objektumon iterálással (`for ... in ...`):

    with open('hello.txt') as f:
        elso = f.readline()
        print('A fájl első sora:', elso)
        for line in f:
            print('Egy sor:', line)

A sorok olvasásánál ne felejtsük el, hogy a Python a teljes sort beolvassa, a sorvégi újsor karakterrel (`\n`) együtt.

### Hibák kezelése

Fájlok kezelése közben több hiba is előfordulhat, ezeknek a kezelésére fontos odafigyelni. Például ha írásra nyitunk meg egy addig nem létező fájlt, az létre fog jönni, de olvasás esetén egy `FileNotFoundError` kivételt kapunk. Ezt így érdemes kezelni:

    try:
        with open('hello.txt') as f:
            for line in f:
                print('Egy sor:', line)
    except FileNotFoundError:
        print('Nem létezik a fájl!')

### Karakterkódolás

Opcionális paraméterként megadható még a fájl kódolása is, erre főleg akkor lehet szükség, ha több, esetleg különböző programnyelven írt alkalmazásból kezelünk egy fájlt – vagy olyan fájllal kell dolgoznunk, amit más forrásból kapunk és nem a mi Python verziónk alapértelmezett kódolását használja.

    f = open('hello.txt', encoding='ascii')

### Mappák kezelése

Mappák listázására az `os` modul `scandir()` függvénye használható. Ez egy iterálható tárolót ad vissza, amely `DirEntry` típusú objektumokat tartalmaz. Az objektumok lényeges attribútumai és függvényei: `name` = név, `path` = teljes elérési út, `is_dir()` = mappa-e, `is_file()` = fájl-e.

A lényeget összefoglalja ez az apró kódrészlet:

    import os

    dirname = input()
    dirlist = os.scandir(dirname)
    for e in dirlist:
        print(e.name, e.path, e.is_dir(), e.is_file())