Přehled základních knihoven v Pythonu
Přehled všech standardních knihoven je v dokumentaci Pythonu. My si ukážeme jen několik z nich.
random
- Generování náhodných čísel.
- dokumentace
- příklad použití
csv
- Čtení a zápis formátu CSV (comma-separated values).
- dokumentace
- příklad čtení (stáhněte si taky
sample.csv
) - příklad zápisu
sys
- Přístup k interpretu Pythonu (např. čtení argumentů z příkazové řádky, vypisování na chybový výstup).
- dokumentace
- příklad použití
argparse
- Zpracování argumentů z příkazové řádky.
- dokumentace
- příklad použití
enum
- Definice výčtových datových typů – když máme nějakou předem známou množinu možných hodnot (např. dny v týdnu).
- dokumentace
- příklad použití
logging
- Informační a ladící výpisy. Na rozdíl od
print()
si můžete nastavit u každé zprávy její závažnost a pak při spuštění logovat jen zprávy určité závažnosti (např. při ladění chceme všechny zprávy, ale při běžném spuštění chceme hlásit jen chyby). Taky se dá nastavit, aby logovací výpisy automaticky vypisovaly čas zprávy. - Úrovně závažnosti:
DEBUG
: Podrobné informace, které mají význam při určování příčiny problémuINFO
: Potvrzení, že kód funguje podle očekáváníWARNING
: Nastala neočekávaná událost nebo upozornění na blížící se problémERROR
: Program není schopen z důvodu závažnější chyby vykonat požadovanou funkciCRITICAL
: Závažná chyba, která může celý program uvést do nekonzistentního stavu
- dokumentace
- příklad použití
- Informační a ladící výpisy. Na rozdíl od
os
- Rozhraní k operačnímu systému (např. vytváření složek, přesouvání souborů, spouštění příkazů).
- dokumentace
- příklad použití
pathlib
- Reprezentace cest k souborům a složkám a práce s nimi.
- dokumentace
- příklad použití
json
- Čtení a zápis formátu JSON (JavaScript Object Notation).
- dokumentace
- příklad čtení (stáhněte si taky
sample.json
) - příklad zápisu
Úlohy na procvičení
Buďte lepší než Spotify
Před pár lety se mi stalo, že v playlistu mých nejposlouchanějších skladeb roku, který Spotify automaticky generuje, jsem měl hned několik skladeb, které jsem nikdy v životě neslyšel. Tak jsem si říkal, že vy to zvládnete líp než inženýři ze Spotify a vytvoříte pro mě playlist mých nejčastěji poslouchaných skladeb.
Vyzkoušet si to můžete v úloze Generátor playlistů pro Spotify v ReCodExu.
Ladění pomocí logování
Program average_grade.py
by měl počítat průměrnou známku několika studentů zaokrouhlenou na dvě desetinná místa. Bohužel, v programu je několik chyb. Vaším úkolem je chyby najít a odstranit. Využijte při tom záznamy z logování – když program spustíte, uloží se logy do souboru average_grade.log
. Pak můžete logy v souboru projít a najít v nich chyby, které při běhu programu nastaly.
Existence souboru
Pomocí knihoven argparse
a pathlib
vytvořte program, který bude ověřovat existenci souboru.
Program dostane cestu k souboru jako svůj poziční argument na příkazové řádce. Výstupem by mělo být True
nebo False
podle toho, jestli daný soubor existuje.
Příklady
Předpokládejme, že váš program se jmenuje file_exists.py
a že existuje soubor jménem soubor
.
- Při spuštění příkazu
python file_exists.py soubor
by program měl vypsatTrue
(soubor existuje). - Při spuštění příkazu
python file_exists.py neexistujici_soubor
by program měl vypsatFalse
(soubor neexistuje). - Při spuštění příkazu
python file_exists.py
by program měl vypsat chybovou hlášku, že nebyla specifikována cesta k souboru (toargparse
udělá za vás).
🦉 Bonus: Soubory a složky
Doplňte do programu další dva volitelné argumenty (options). Pokud je nastaven option -f
, program ověřuje, že zadaná cesta existuje a je to soubor (ne složka). Pokud je nastaven option -d
, program ověřuje, že zadaná cesta existuje a je to složka (ne soubor). Pokud jsou nastaveny oba optiony, program vypíše chybu, že nejde použít oba optiony najednou.
Předpokládejme, že váš program se jmenuje file_exists.py
a že existuje soubor jménem soubor
a složka jménem slozka
.
- Při spuštění příkazu
python file_exists.py soubor
by program měl vypsatTrue
(soubor existuje). - Při spuštění příkazu
python file_exists.py -f soubor
by program měl vypsatTrue
(soubor existuje). - Při spuštění příkazu
python file_exists.py soubor -f
by program měl vypsatTrue
(na pořadí argumentů nezáleží – to za vás řešíargparse
). - Při spuštění příkazu
python file_exists.py -d soubor
by program měl vypsatFalse
(soubor není složka). - Při spuštění příkazu
python file_exists.py -d slozka
by program měl vypsatTrue
(složka existuje). - Při spuštění příkazu
python file_exists.py -f -d slozka
by program měl vypsat chybu (nejde použít oba optiony současně).
Načtení seznamu osob z CSV
V souboru lide.csv
je seznam jmen, e-mailů a telefonů několika lidí ve formátu CSV. Pomocí knihovny csv
načtěte data ze souboru a vypište je v následujícím formátu:
Osoba: <name> <surname>
E-mail: <email>
Telefon: <phone>
Například pro soubor lide.csv
:
name,surname,email,phone
Michal,Töpfer,topfer@d3s.mff.cuni.cz,123456789
Tomáš,Holan,holan@ksvi.mff.cuni.cz,111222333
vypište
Osoba: Michal Töpfer
E-mail: topfer@d3s.mff.cuni.cz
Telefon: 123456789
Osoba: Tomáš Holan
E-mail: holan@ksvi.mff.cuni.cz
Telefon: 111222333
Caesarova šifra
Doplňte řešení úlohy Caesarova šifra textu – soubor o načítání argumentů z příkazové řádky (pomocí knihovny argparse
):
-f
– vstupní soubor,-o
– výstupní soubor,-k
– hodnota klíče (posunu).
Program se pak spustí třeba takto: python caesar.py -f in.txt -o out.txt -k 3
.
Generování náhodných CSV souborů podle JSON konfigurace
Na základě konfigurace uložené v JSON souboru config.json
vygenerujte CSV soubor random.csvý
s náhodnými hodnotami. Použijte knihovny json
, csv
a random
.
Konfigurace obsahuje položky "rows"
a "columns"
. Položka "rows"
je celé číslo udávající, kolik řádků máte vygenerovat. Položka "columns"
obsahuje seznam konfigurací sloupců. Každý sloupec má jméno ("name"
) a typ ("type"
). Pokud je typ "number"
, obsahuje konfigurace sloupce navíc hodnoty "low"
a "high"
a vaším cílem je generovat náhodné číslo z tohoto rozsahu. Pokud je typ "choices"
, obsahuje definice sloupce navíc seznam "choices"
a vaším cílem je generovat náhodnou položku ze seznamu.
Příklad konfigurace:
{
"rows": 5,
"columns": [{
"name": "kostka",
"type": "number",
"low": 1,
"high": 6
},{
"name": "mince",
"type": "choices",
"choices": ["panna", "orel"]
}]
}
Vaším cílem je vygenerovat CSV soubor o daném počtu řádků, přičemž hodnota buňky je vždy náhodně vygenerovaná podle konfigurace daného sloupce. Nezapomeňte do CSV souboru napsat jména sloupců jako hlavičku.
Například pro konfiguraci výše (config.json
) je možný výstup (random.csv
) následovný:
kostka,mince
3,orel
1,orel
3,panna
5,orel
6,panna
Učební výstupy
Učební výstupy podávají zhuštěný souhrn základních konceptů a dovedností, které byste měli umět vysvětlit a/nebo použít po každém cvičení. Hvězdičkou (⭐) je označena látka nad rámec předmětu Programování 1, kterou tedy teď nemusíte umět, ale někdy v budoucnu se vám může hodit.
- vědět o existenci standardní knihovny (můžeme využít kód, který už za nás naprogramoval někdo jiný) a kde najít dokumentaci
- ⭐ generovat náhodná čísla pomocí modulu
random
- ⭐ načíst nebo vytvořit CSV soubor (tabulka dat) – modul
csv
- ⭐ načíst a zpracovat argumenty z příkazové řádky (
sys.argv
, modulargparse
) - ⭐ zachytit důležité momenty v běhu programu pomocí logovacích zpráv s různou úrovní detailu (debug, info, warning, error) – modul
logging
- ⭐ umět vytvořit a použít výčtový datový typ (modul
enum
)
- ⭐ generovat náhodná čísla pomocí modulu
- ⭐ umět použít dědičnost pro definici kontraktu, který potomci musí implementovat – abstraktní třída definuje, jaké metody (včetně parametrů a typu návratové hodnoty) musí potomci implementovat; ideálně i umět použít modul
abc
pro zápis abstraktních tříd - ⭐ umět využít kompozici pro tvorbu složitých objektů pomocí skládání (jednoduchých) objektů