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.

V minulé lekci jsme se bavili o tom, jak dostat do našeho programu data pomocí parametrů příkazové řádky. Takový způsob ale brzy narazí na své limity především proto, že na příkazovou řádku se nám vejde jen pár hodnot. Proto dnes přejdeme k druhému způsobu předávání dat do našeho programu a tím je čtení souborů na disku.

Č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.text tedy dostal "přezdívku" vstup.

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 překopírovaný do seznamu radky 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. Celý obsah souboru uložíme do seznamu radky pomocí metody readlines(). Ta uloží každý řádek souboru jako jeden prvek seznamu.

Náš kód pak může vypadat například takto:

with open('mereni.txt', encoding='utf-8') as vstup:
  radky = vstup.readlines()
print(radky)

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. Pokud bychom chtěli načtené řádky rozdělit na jednotlivé hodnoty, bude náš program vypadat například takto:

with open('mereni.txt', encoding='utf-8') as vstup:
  radky = vstup.readlines()

radky = [radek.split('\t') for radek in radky]
radky = [[radek[0], float(radek[1])] for radek in radky]
print(radky)

Cvičení: Čtení ze souborů

1

Zatím jsme výplatu počítali za předpokladu, že každý měsíc odpracujeme stejný počet hodin, což není příliš realistické. Vytvořte proto textový soubor vykaz.txt, který bude obsahovat 12 řádků a na každém řádku počet odpracovaných hodin za každý měsíc za poslední rok.

  1. Otevřete tento soubor ve svém programu a načtěte hodnoty na řádcích do seznamu vykaz. Vytiskněte tento seznam na konzoli funkcí print() abyste si ověřili, že jste soubor načetli správně.
  2. Nechte uživatele zadat na příkazovém řádku hodinovou mzdu. Spočítejte a na výstup vytiskněte celkovou výplatu za celý rok a průměrnou výplatu na jeden měsíc.
2

Počet slov

zapni hlavu

Stáhněte si odevzdanou slohovou práci. Zadání bylo sepsat text o nejméně 150ti slovech pojednávající o našem hlavním městě. Napište program, který spočítá počet slov v tomto textu, abychom věděli, zda bylo zadání formálně splněno. Nechte se vést následujícím návodem.

  1. Nechte váš program otevřít soubor a načíst jednotlivé řádky do seznamu.
  2. Každý řádek převeďte na seznam slov. Slovem se rozumí vše, co je odděleno mezerou nebo novým řádkem.
  3. Vypište na výstup seznam hodnot udávající počty slov na každém řádku.
  4. Vypište na výstup celkový počet všech slov v souboru.

Bonus

3

Půjčovna

zavařovačka

Půjčovna aut má v každém kraji ČR jedno auto s danou SPZ. Ke konci roku chce zjistit, kolik všechna auta najezdila dohromady kilometrů. V souboru auta.txt je pro každou SPZ zaznamenáno kolik dané auto ujelo kilometrů za daný rok. Hodnoty jsou v tisících kilometrů. Bohužel se v jednotlivých krajích blbě zkoordinovali a někdo používal desetinnou čárku, někdo zase tečku.

V souboru s daty je ještě jeden problém, který není na první pohled vidět. Dá se vyřešit pomocí list comprehension s podmínkou uvedeném v předchozím čtení na doma.

  1. Napište program, který na výstup vypíše součet všech ujetých kilometrů. Jistě se vám bude hodit metoda řetězců jménem replace().
  2. Upravte váš program tak, aby jméno souboru k otevření dostal na příkazové řádce, abychom mohli takto zpracovávat výkazy z různých souborů, aniž bychom museli upravovat samotný kód programu.