Kódím.cz
5

Soubory: čtení a zápis

Naučíme se jak číst a zapisovat data do souborů na disku a tím v naších programech zpracovávat větší objemy dat.

Čtení ze souborů

V praxi často máme data uložena v nějakém souboru na disku v nějakém textovém formátu. Ukážeme si, jak takový soubor v Pythonu otevřít a data z něj přečíst.

Pro naše první experimenty si stáhněte soubor mereni.txt. Ten obsahuje naměřené teploty během týdne, které jsme už několikrát v našich programech používali.

Pokud chceme otevřít tento soubor v nějakém našem programu, nejjednodušší je zkopírovat jej do téže složky, ve které máme program uložený. Potom v programu použijeme funkci open(), která slouží k otevírání souborů. Nejčastěji se soubor otevírá v kombinaci se klíčovým slovem with. Tím automaticky zajistíme uzavření souboru a nebudeme ho blokovat. Současně si otevřený soubor musíme pojmenovat. Jméno vložíme za další klíčové slovo as. Náš soubor mereni.txt tedy dostal "přezdívku" file.

Všimni si, že prostřední řádek je odsazený o jedno odsazení vpravo. To není náhoda, tento řádek se totiž nachází v bloku. Pomocí bloku říkáme, v jaké části programu chceme pracovat s naším souborem a kdy ho již Python může uzavřít. Mezi řádkem 2 a 3 tedy v tichosti dojde k uzavření souboru. Nám to ale vůbec nevadí, protože obsah souboru máme načtený a ten nám nikam nezmizí.

Na konci úvodního řádku bloku vkládáme dvojtečku. Dvojtečka na konci řádku pak pro nás bude sloužit jako připomenutí, abychom alespoň jeden následující řádek odsadili. Ve stresu z toho ale být nemusíme, protože editor kódu to většinou udělá za nás.

Různé možnosti načítání souboru

Nejjednodušší je načíst si obsah souboru do jednoho řetězce. Slouží k tomu metoda read() u objektu otevřený soubor. Tento způsob se hodí, pokud máme v souboru uložený pouze jeden řádek nebo z nějakého důvodu chceme mít řetězec, který přesně odpovídá uloženému souboru.

with open('mereni.txt', encoding='utf-8') as file:
    text = file.read()

print(text)

Častěji však budeme potřebovat rozdělit soubor na řádky. Využijeme toho, že otevřený soubor můžeme také načítat v cyklu for. Do proměnné line se nám uloží vždy jeden řádek souboru jako řetězec. Tento způsob má také tu výhodu, že po řádcích můžeme zpracovávat i dost velký soubor, které by se nám jinak nevešel do operační paměti počítače.

Tento kód sice načte celý soubor do paměti, ale pracuje po řádcích, ze kterých vytvoří seznam.

lines = []

with open('mereni.txt', encoding='utf-8') as file:
    for line in file:
        lines.append(line)

print(lines)

Výstup z našeho programu pak bude vypadat takto:

['po\t17.3\n', 'út\t16.8\n', 'st\t15.1\n', 'čt\t13.2\n', 'pá\t14.0\n', 'so\t13.9\n', 'ne\t15.8\n']

Výstupem je skutečně seznam řetězců, které ale obsahují znaky zpětných lomítek. Tato zpětná lomítka slouží k vyjádření speciálních znaků, které by jinak nešly do řetězce vložit. Anglicko/česky se jim říká escape sekvence a my si představíme základní dvě. Nový řádek se píše jako '\n', tabulátor jako '\t'. Existuje jich ještě mnoho dalších, ale tyto nám zatím postačí.

Vidíme tedy, že každý náš řádek končí znakem nového řádku a hodnoty na něm jsou odděleny tabulátorem.

output = []

with open('mereni.txt', encoding='utf-8') as file:
    for line in file:
        day, temp = line.split('\t')
        output.append([day, float(temp)])

print(output)

V předchozí ukázce vidíme elegantní uložení dvou hodnot na řádku rozdělené podle znaku tabulátor do samostatných proměnných day a temp. Jedná se o praktické využití datového typu tuplen-tice. Toto si můžeme dovolit díky tomu, že přesně známe strukturu dat, se kterými pracujeme.

Cvičení: Čtení ze souborů

Bonus