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
  • csv
  • 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
  • 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ému
      • INFO: 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ém
      • ERROR: Program není schopen z důvodu závažnější chyby vykonat požadovanou funkci
      • CRITICAL: Závažná chyba, která může celý program uvést do nekonzistentního stavu
    • dokumentace
    • příklad použití
      • Můžete si prohlédnout výpisy pro úroveň DEBUG a ERROR
  • os
  • pathlib
  • json

Ú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 vypsat True (soubor existuje).
  • Při spuštění příkazu python file_exists.py neexistujici_soubor by program měl vypsat False (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 (to argparse 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 vypsat True (soubor existuje).
  • Při spuštění příkazu python file_exists.py -f soubor by program měl vypsat True (soubor existuje).
  • Při spuštění příkazu python file_exists.py soubor -f by program měl vypsat True (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 vypsat False (soubor není složka).
  • Při spuštění příkazu python file_exists.py -d slozka by program měl vypsat True (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, modul argparse)
    • ⭐ 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)
  • ⭐ 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ů