Fájlok olvasása Python segítségével

Bevezetés

A tárolt adatokkal való munkavégzés érdekében a fájlkezelés minden professzionális Python programozó alapvető tudásává válik. Már a legkorábbi kiadásától kezdve az adatok olvasása és fájlba írása is beépített Python funkciók. Összehasonlítva más programozási nyelvekkel, mint például a C vagy a Java, ez meglehetősen egyszerű, és csak néhány sornyi kódot igényel. Ezen túlmenően, ehhez nem kell külön modult betölteni.

Ebben a cikkben példákon keresztül elmagyarázzuk, hogyan lehet fájlokat olvasni Python segítségével. Néhány példa a fájl soronkénti, csonkként történő (egyszerre meghatározott számú sor) beolvasása és egy fájl egy menetben történő beolvasása. Azt is megmutatjuk, hogyan olvashat ki egy adott sort a fájlból, anélkül, hogy a teljes fájlban keresne.

A fájlok alapjai a Pythonban

A fájlokkal való kezelés általános módszerei a következők open() fájl megnyitásához, seek() a fájl aktuális pozíciójának beállításához az adott eltoláson, és close() a fájlobjektum bezárásához, amikor befejezte a használatát. A beépített open() A függvény egy fájlleírót ad vissza, amely egy fájlobjektumot jelöl, amelyet a fájl eléréséhez használnak olvasásra, írásra vagy hozzáfűzésre.

Amikor megnyit egy fájlt olvasásra, a Pythonnak pontosan tudnia kell, hogyan kell a fájlt megnyitni a rendszerrel. Két hozzáférési mód áll rendelkezésre – olvasás és olvasás bináris módban. A használt zászlók a következők 'r'és 'rb', és meg kell adni a beépített fájl megnyitásakor open() funkció. Az első mód magában foglalja a speciális karakterek, például a „CR” (kocsivissza) és az „LF” (soremelés) értelmezését a sortörések megjelenítésére, míg a bináris mód lehetővé teszi az adatok nyers módban történő olvasását – ahol az adatok tárolása olyan formában történik. további értelmezés nélkül.

Miután megnyitott egy fájlt, a open() függvény visszaküld egy fájlobjektumot. Ezek a fájlobjektumok olyan metódusokkal rendelkeznek, mint read(), readline(), write(), tell()és seek(). Míg egyes fájlobjektumok (vagy fájlszerű objektumok) az itt felsoroltaknál több metódussal rendelkeznek, ezek a leggyakoribbak. Nem minden fájlobjektumnak kell az összes fájlmetódusot megvalósítania.

Fájl olvasása soronként

Az első példát a két programozási nyelv – a C és a C++ – ihlette. Valószínűleg ez a legintuitívabb megközelítés – nyissa meg a fájlt a open() funkció, olvassa el a fájlt soronként használatával readline() módszert, és a sort közvetlenül az olvasás után adja ki.

Itt használatban van a while ciklus, amely folyamatosan olvas a fájlból, amíg a readline() metódus folyamatosan visszaadja az adatokat. Ha eléri a fájl végét (EOF), a while A ciklus leáll, és a fájlobjektum bezárul, felszabadítva az erőforrásokat más programok számára:


filename = "test.txt"

filehandle = open(filename, 'r')
while True:
    
    line = filehandle.readline()
    if not line:
        break
    print(line)


filehandle.close()

Amint azt már észrevette, ebben a példában kifejezetten megnyitottuk és bezártuk a fájlt. Bár a Python értelmező automatikusan bezárja a megnyitott fájlokat a Python program végrehajtásának végén, kifejezetten bezárja a fájlt close() jó programozási stílus, és nem szabad elfelejteni.

Javításként a kényelmes iterátor protokoll Python 2.3-ban került bevezetésre. Ez lehetővé teszi, hogy egyszerűsítse a readline hurok:


filename = "test.txt"
for line in open(filename, 'r'):
    print(line)

Itt használatban van a for hurok a in iterátor. Az aktuális vonal azonosítása a segítségével történik in iterator, olvassa be a fájlt, és annak tartalma a kimenetre kerül stdout. A Python lefedi a fájl megnyitását és bezárását, ha az kiesik a hatóköréből. Bár nem hatékony, ez lehetővé teszi, hogy többé ne kelljen fájlkezelőkkel foglalkoznia.

Sajnos a fenti kód kevésbé egyértelmű, és a Python belső szemétgyűjtésére támaszkodik a fájl bezárásának kezeléséhez.

A Python 2.5-ben bevezetett, a with parancs még jobban beágyazza a teljes folyamatot, és a fájlok megnyitását és bezárását is csak egyszer kezeli a hatókörű kódblokkban:


filename = "test.txt"
with open(filename, 'r') as filehandle:
    for line in filehandle:
        print(line)

A. Kombinációja with nyilatkozat és a open() parancs csak egyszer nyitja meg a fájlt. Siker esetén a for ciklus végrehajtásra kerül, és a sor tartalma kinyomtatásra kerül stdout.

Továbbá a használata a with kijelentésnek van mellékhatása. Belsőleg a Python értelmező létrehozza a try-finally-block a fájlból való olvasás beágyazásához. A következő példa azt mutatja be, hogy mi történik a Python belsejében lényegében a with kód blokkok:

try:
    filehandle = open(filename, 'r')
    
finally:
    filehandle.close()

Fájl olvasása sordarabként

Eddig soronként dolgoztuk fel a fájlokat. Ez meglehetősen lassú nagy fájlok esetén, és javítható több sor egyidejű olvasásával. Ennek eléréséhez a islice() módszer a itertools modul lép működésbe. Emellett iterátorként is működik, és visszaad egy adattömeget, amely a következőkből áll n vonalak. A fájl végén az eredmény rövidebb lehet, és végül a hívás üres listát ad vissza:

from itertools import islice

filename = "test.txt"

number_of_lines = 5

with open(filename, 'r') as input_file:
    lines_cache = islice(input_file, number_of_lines)
   
    for current_line in lines_cache:
        print (current_line)

Adott sor beolvasása fájlból

A fent bemutatott módszerekkel más hasznos műveleteket is végrehajthatunk, például egy adott sort kiolvashatunk egy fájlból. Ehhez egy számlálót használunk, és kinyomtatjuk a megfelelő sort, amikor elérjük a fájl iterációját:


filename = "test.txt"

line_number = 3
print (f"line {line_number} of {filename} is: ")

with open(filename, 'r') as filehandle:
current_line = 1
    for line in filehandle:
        if current_line == line_number:
            print(line)
            break
        current_line += 1

Ennek könnyen érthetőnek kell lennie, de egy kicsit hosszabb, mint az előző példák. A segítségével rövidíthető linecache modult.

A következő példa bemutatja, hogyan egyszerűsítheti le a kódot a getline() módszer. Ha a kért sorszám kiesik a fájl érvényes sorainak tartományából, akkor a getline() metódus egy üres karakterláncot ad vissza:


import linecache

filename = "test.txt"

line_number = 3

line = linecache.getline(filename, line_number)
print (f"line {line_number} of {filename}:")
print (line)

A teljes fájl beolvasása egyszerre

Végül, de nem utolsósorban az előző példától egészen más esetet tekintünk meg – egy teljes fájl egy menetben történő olvasását.

Ne feledje, hogy a legtöbb esetben elegendő memóriával kell rendelkeznie a teljes fájl elolvasásához, mivel a karakterek nem foglalnak túl sok helyet, de el kell fáradni a nagy fájlokkal. A következő példa a következők kombinációját használja with nyilatkozatot, és a read() módszer. Ebben az esetben használjuk read() a fájltartalom adatfolyamként való betöltéséhez:

Tekintse meg gyakorlatias, gyakorlati útmutatónkat a Git tanulásához, amely tartalmazza a bevált gyakorlatokat, az iparág által elfogadott szabványokat és a mellékelt csalólapot. Hagyd abba a guglizást a Git parancsokkal, és valójában tanulni meg!


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.read()
    print (filecontent)

A Python is kínálja a readlines() módszer, amely hasonló a readline() módszer az első példából. Szemben read(), a fájl tartalma egy listában kerül tárolásra, ahol a tartalom minden sora egy-egy elem:


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.readlines()
    for line in filecontent:
        print (line)

Míg readlines() addig olvassa a tartalmat a fájlból, amíg el nem éri az EOF-t, ne feledje, hogy korlátozhatja az olvasott tartalom mennyiségét is, ha megadja a sizehint paraméter, ami az olvasandó bájtok száma.

Következtetés

Szokás szerint egynél több módja is van egy fájl tartalmának olvasására. Sebesség tekintetében nagyjából mindegyik egy kategóriába tartozik. Az Ön számára legmegfelelőbb megoldás az Ön konkrét felhasználási esetétől függ. Szerintünk nagyon hasznos, ha megnézzük, mi lehetséges, majd kiválasztjuk a legmegfelelőbb megoldást.

Bár a Python nagymértékben leegyszerűsíti a fájlok beolvasásának folyamatát, időnként még mindig bonyolulttá válhat, ebben az esetben azt javaslom, hogy tekintse meg a hivatalos Python dokumentáció Ha többet akarsz tudni.

Időbélyeg:

Még több Stackabus