V každém programovacím jazyce je práce se soubory klíčová. Python nabízí rozsáhlé možnosti manipulace se soubory, včetně čtení, zápisu a dalších operací.
Po prostudování tohoto návodu budete umět:
- Otevírat a načítat data ze souborů v Pythonu.
- Získávat jednotlivé řádky z textových souborů.
- Zapisovat do souborů a přidávat obsah na jejich konec.
- Efektivně pracovat se soubory za pomocí kontextových manažerů v Pythonu.
Jak číst soubor v Pythonu
Pro otevření souboru v Pythonu se používá funkce open()
s následující syntaxí: open('název_souboru', 'režim')
.
název_souboru
udává jméno souboru, se kterým chceme pracovat.
Poznámka: Pokud se soubor nachází ve stejném adresáři jako váš skript, stačí uvést pouze jeho jméno. V opačném případě je nutné specifikovat celou cestu k souboru.
- Parametr
režim
definuje, jakým způsobem se má soubor otevřít (čtení, zápis, atd.).
Výchozí režim pro otevírání souboru je režim čtení (‚r‘), ale doporučuje se tento režim vždy explicitně uvést.
Než se pustíme do kódování, představme si soubor lib.txt
, který budeme v příkladech používat.
📁 Textový soubor a kód z tohoto návodu si můžete stáhnout z tohoto repozitáře na GitHubu.
Následující ukázka kódu demonstruje, jak otevřít a načíst obsah textového souboru lib.txt
v Pythonu za použití funkce open()
:
file = open('lib.txt','r') contents = file.read() print(contents) file.close() # Výstup # Hello, there! # Here are a few helpful Python libraries: # 1) NumPy # 2) pandas # 3) matplotlib # 4) seaborn # 5) scikit-learn # 6) BeautifulSoup # 7) Scrapy # 8) nltk # 9) Bokeh # 10) statsmodels
V tomto příkladu:
- Funkce
open()
vrací objekt souboru, který jsme uložili do proměnnéfile
. - Následně voláme metodu
read()
na tento objekt. - Proměnná
contents
nyní obsahuje veškerý obsah souboru, který vytiskneme. - Nakonec soubor uzavřeme pomocí
file.close()
.
Pokud však zapomenete soubor zavřít, může dojít k neefektivnímu využívání systémových zdrojů. Při práci s velkým počtem souborů to může vést k významnému nárůstu spotřeby paměti. Je to z důvodu, že soubory zůstávají otevřené, i když s nimi již nepracujeme.
Nyní si ukážeme, jak lépe pracovat se soubory za použití kontextových manažerů. Následující kód demonstruje jejich použití:
with open('lib.txt','r') as f: contents = f.read() print(contents)
Při práci se soubory prostřednictvím kontextových manažerů, není nutné volat metodu close()
. Soubory se po skončení bloku with
automaticky uzavřou.
Jak číst řádky ze souboru v Pythonu
Náš ukázkový soubor má jen pár řádků, takže čtení celého obsahu najednou nepředstavuje problém.
Nicméně, pokud potřebujeme pracovat s většími soubory, nemusí být metoda read()
příliš efektivní.
Ve skutečnosti může dojít k nedostatku paměti při čtení velmi velkých souborů. V takových případech je lepší číst soubor po řádcích. V této části se dozvíte, jak na to.
Použití metody readline()
pro čtení řádků
Metoda readline()
načítá z otevřeného souboru vždy jeden řádek.
Podívejte se na následující kód:
with open('lib.txt','r') as f: line = f.readline() print(line) line = f.readline() print(line) # Výstup # Hello, there! # Here are a few helpful Python libraries:
Po prvním volání readline()
se vypíše první řádek souboru. Druhé volání vypíše druhý řádek.
Je to proto, že po přečtení prvního řádku se ukazatel souboru přesune na začátek druhého řádku.
V Pythonu můžeme získat aktuální pozici ukazatele souboru pomocí metody tell()
. Pro přesunutí ukazatele na konkrétní pozici slouží metoda seek()
.
V následujícím příkladu používáme f.seek(0)
po prvním volání metody readline()
. To přesune ukazatel na začátek souboru, proto se v obou případech vytiskne první řádek.
with open('lib.txt','r') as f: line = f.readline() print(line) f.seek(0) line = f.readline() print(line) # Výstup # Hello, there! # Hello, there!
Použití metody readlines()
pro čtení řádků
Další související metodou je readlines()
.
Po spuštění následujícího kódu uvidíte, že metoda readlines()
vrací seznam všech řádků v souboru.
with open('lib.txt','r') as f: lines = f.readlines() print(lines) # Výstup # ['Hello, there!\n', 'Here are a few helpful Python libraries:\n', # '1) NumPy\n', '2) pandas\n', '3) matplotlib\n', # '4) seaborn\n', '5) scikit-learn\n', '6) BeautifulSoup\n', # '7) Scrapy\n', '8) nltk\n', '9) Bokeh\n', '10) statsmodels\n', '\n']
Použití cyklu for
pro čtení řádků
K načítání řádků textového souboru můžete také použít cyklus for
.
Jakmile máte objekt souboru, můžete iterovat jeho obsahem po řádcích a vypisovat je. Všimněte si, že v každém kroku pracujeme pouze s jedním řádkem, ne s celým obsahem souboru.
with open('lib.txt','r') as f: for line in f: print(line, end='')
Poznámka: Výchozí oddělovač při použití funkce print()
je znak nového řádku \n
. Protože v původním souboru tyto nové řádky nemáme, musíme nastavit argument oddělovače na prázdný řetězec (end=""
), aby se obsah souboru vytiskl správně.
Jak číst části obsahu ze souboru
V Pythonu můžete číst obsah souboru i po menších částech.
Projděte si následující kód:
- Nastavujeme
chunk_size
na 50. To znamená, že načteme prvních 50 znaků ze souboru a vypíšeme je.
- Poté voláme metodu
tell()
na souborový objektf
. Vidíme, že ukazatel souboru se nachází na pozici 51, což odpovídá očekávání.
chunk_size = 50 with open('lib.txt','r') as f: chunk = f.read(chunk_size) print(chunk) current = f.tell() print(f"Current position of file pointer: {current}") # Výstup # Hello, there! # Here are a few helpful Python librar # Current position of file pointer: 51
Tuto techniku můžeme použít i pro čtení celého souboru po malých částech.
Následující ukázka kódu ukazuje, jak na to:
chunk_size = 50 with open('lib.txt','r') as f: chunk = f.read(chunk_size) print(chunk,end='') while(len(chunk)>0): chunk = f.read(chunk_size) print(chunk,end='') # Výstup # Hello, there! # Here are a few helpful Python libraries: # 1) NumPy # 2) pandas # 3) matplotlib # 4) seaborn # 5) scikit-learn # 6) BeautifulSoup # 7) Scrapy # 8) nltk # 9) Bokeh # 10) statsmodels
Zde používáme cyklus while
k načítání obsahu souboru po blocích o velikosti 50 znaků, dokud nedosáhneme konce souboru. ✅
Jak zapisovat do souboru v Pythonu
Pro zápis do textového souboru v Pythonu musíme soubor otevřít v režimu zápisu ('w'
).
Následující kód demonstruje, jak na to:
with open('new_file.txt','w') as f: f.write('Hello, Python!')
Po spuštění kódu se ve vašem pracovním adresáři vytvoří soubor new_file.txt
.
Nyní spusťte tento kód ještě jednou.
V terminálu zadejte následující příkaz:
cat new_file.txt # Výstup: Hello, Python!
Při ideálním scénáři jsme do souboru zapisovali dvakrát. Měl by se tedy text „Hello, Python!“ objevit dvakrát, že?
Nicméně, text se vypsal pouze jednou. To je z důvodu, že když otevřete soubor v režimu zápisu (w
), jeho obsah je vždy přepsán novým obsahem.
Pokud chceme na konec souboru přidávat obsah bez přepsání stávajícího, musíme soubor otevřít v režimu přidávání. Ukážeme si, jak na to, v následující sekci.
Jak přidávat obsah na konec souboru
Chceme-li přidávat obsah na konec souboru bez přepsání, musíme použít režim přidávání.
Toho dosáhneme použitím režimu 'a'
.
Následující kód spustíme dvakrát.
with open('new_file.txt','a') as f: f.write('Hello, Python!')
Vidíme, že text se nyní vytiskl dvakrát, protože jsme obsah na konec souboru přidali.
cat new_file.txt # Výstup: Hello, Python!Hello, Python!
Závěr
Rychle si shrňme, co jsme si v tomto tutoriálu probrali:
- Naučili jste se základní operace se soubory, jako je čtení, zápis a přidávání obsahu.
- Také jsme si ukázali, jak používat metodu
seek()
pro přesouvání ukazatele v souboru a metodutell()
pro zjišťování aktuální pozice ukazatele.
Doufám, že vám tento návod pomohl. Nyní, když umíte pracovat s textovými soubory v Pythonu, zjistěte, jak pracovat se soubory JSON v Pythonu.
Související:
Zkontrolujte délku seznamu v Pythonu ve 3 krocích.