Ahoj! Načítání textového souboru řádek po řádku v Pythonu je velmi častý úkol a existuje několik elegantních způsobů, jak to udělat. Ukážu ti ty nejběžnější a nejlepší.
Nejvíce "pythonický" a doporučený způsob je použít kontextový manažer (with open(...)) a iterovat přímo přes souborový objekt. Kontextový manažer se postará o to, aby byl soubor správně uzavřen, i když dojde k chybě.
Zde je základní příklad:
# Název souboru, který chceme číst
nazev_souboru = "muj_soubor.txt"
try:
with open(nazev_souboru, 'r', encoding='utf-8') as soubor:
for radek in soubor:
# Každý 'radek' zde obsahuje jeden řádek ze souboru,
# včetně znaku nového řádku (\n) na konci.
# Pokud ho chcete odstranit, použijte .strip()
print(radek.strip()) # .strip() odstraní bílé znaky (včetně \n) z obou konců řádku
except FileNotFoundError:
print(f"Soubor '{nazev_souboru}' nebyl nalezen.")
except Exception as e:
print(f"Nastala chyba při čtení souboru: {e}")
Pojďme si rozebrat, co se v kódu děje:
-
nazev_souboru = "muj_soubor.txt": Definujeme si název souboru. Ujistěte se, že tento soubor existuje ve stejném adresáři jako váš skript, nebo zadejte plnou cestu k souboru.
-
try...except blok: Používáme ho pro ošetření možných chyb, jako je například situace, kdy soubor neexistuje (FileNotFoundError), nebo jiné problémy při čtení souboru.
-
with open(nazev_souboru, 'r', encoding='utf-8') as soubor::
open(...): Funkce pro otevření souboru.
nazev_souboru: První argument je název souboru.
'r': Druhý argument je mód otevření souboru. 'r' znamená "read" (čtení). Další běžné módy jsou 'w' (write - zápis, přepíše existující soubor nebo vytvoří nový) a 'a' (append - připojení na konec souboru).
encoding='utf-8': Toto je velmi důležité! Specifikuje kódování souboru. UTF-8 je dnes velmi rozšířené a podporuje širokou škálu znaků (včetně českých). Pokud váš soubor používá jiné kódování (např. windows-1250 pro starší české soubory), musíte ho zde uvést, jinak se mohou znaky zobrazit nesprávně.
as soubor: Otevřený souborový objekt je přiřazen proměnné soubor.
with: Klíčové slovo, které zajišťuje, že soubor bude automaticky uzavřen po dokončení bloku kódu (i v případě chyby). Je to preferovaný způsob práce se soubory.
-
for radek in soubor:: Toto je kouzlo! Souborové objekty v Pythonu jsou iterovatelné. To znamená, že můžete procházet soubor řádek po řádku pomocí jednoduché for smyčky. Python efektivně načítá každý řádek postupně, takže to funguje dobře i pro velmi velké soubory, aniž by se celý soubor načetl do paměti najednou.
-
print(radek.strip()):
radek: Proměnná, která v každé iteraci smyčky obsahuje jeden řádek textu ze souboru. Důležité: Tento řádek bude obvykle obsahovat i znak nového řádku (\n) na svém konci (kromě možná posledního řádku souboru, pokud na konci nemá odřádkování).
.strip(): Metoda řetězců, která odstraní tzv. "bílé znaky" (mezery, tabulátory, nové řádky atd.) z začátku a konce řetězce. V tomto případě je užitečná pro odstranění koncového \n. Pokud byste chtěli odstranit pouze koncový nový řádek, můžete použít radek.rstrip('\n').
Alternativní způsob (méně častý pro jednoduché čtení řádek po řádku):
Můžete také použít metodu readline() v cyklu while, ale je to méně přehledné a náchylnější k chybám než přímá iterace.
# Název souboru
nazev_souboru = "muj_soubor.txt"
try:
with open(nazev_souboru, 'r', encoding='utf-8') as soubor:
while True:
radek = soubor.readline()
if not radek: # Konec souboru, readline() vrátí prázdný řetězec
break
print(radek.strip())
except FileNotFoundError:
print(f"Soubor '{nazev_souboru}' nebyl nalezen.")
except Exception as e:
print(f"Nastala chyba při čtení souboru: {e}")
Na co si dát pozor (a proč readlines() není pro tento účel ideální):
Existuje také metoda soubor.readlines(), která načte všechny řádky souboru najednou do seznamu (listu) řetězců.
# Příklad s readlines() - NEPOUŽÍVEJTE pro velké soubory!
try:
with open(nazev_souboru, 'r', encoding='utf-8') as soubor:
vsechny_radky = soubor.readlines() # Načte celý soubor do paměti
for radek in vsechny_radky:
print(radek.strip())
except FileNotFoundError:
# ... ošetření chyb ...
Problém s readlines() je, že pokud je soubor velmi velký, načtení celého souboru do paměti může způsobit problémy s výkonem nebo dokonce vyčerpání paměti. Pro čtení řádek po řádku je iterace for radek in soubor: mnohem efektivnější.
Doufám, že ti to pomohlo! Dej vědět, kdybys měl nějaké další otázky.