08_Soubory C2184 Úvod do programování v Pythonu 8. Práce se soubory, moduly Souborový systém Unix (Linux, MacOS): r I / I r ■j home j- r H etc I I_I Windows: r I C:\ I I_I r ■| Users |-I_I r ■j krteček j- Pietu res School funny_cat.gif ugly_dog.png Python j- hello.py Math j J •—j peppa j-j Videos j J i— funny_video.mp4 boring_video.mp4 ■j Krteček j Pietu res School funny_cat.gif ugly_dog.png Python j- hello.py Math j J •—j Peppa j-j Videos j- j i_ ■j Windows j I_I funny_video.mp4 boring_video.mp4 • Soubor {file) - sada dat uložených pod konkrétním jménem (např. funny_cat.gif) 1 • Adresář, složka {directory, folder) - speciální soubor odkazující na další soubory/složky (např. Pietu res) • Kořenový adresář {root) - nejvyšší adresář v systému (v Unixu /, ve Windowsu může být víc kořenů: C:\, D:\...) • Domovský adresář {home directory) - nastavený pro každého uživatele (např. /home/krtecek), může se zkracovat jako ~ • Aktuální adresář (current working directory) - kde momentálně jsme, vypisuje se v promptu příkazového řádku • Cesta {path) - umístění souboru nebo složky - Absolutní cesta - začíná v kořeni souborového systému: /home/krtecek/Pictu res/f unny_cat. gif (Unix) C :\L)sers\Krtecek\Pictu res\f unny_cat. gif (Windows) - Relativní cesta - bez kořene, začíná v aktuálním adresáři (řekněme krteček): Pictures/funny_cat.gif(Unix) Pictures\funny_cat.gif (Windows) • Speciální znaky v cestě: - Oddělovač složek: / (Unix) nebo \ (Windows) - . - stejná složka - . . - o složku výš (parent) Příklady: = /home/krtecek /Pietu res/./funny_cat.gif = /home/krtecek/Pictu res/funny_cat.gif = /home ./peppa/Videos = /home/peppa/Videos ./.. = / ./../etc = /etc Příkazový řádek (bash, powershell, cmd) - základní příkazy: - pwd - vypiš aktuální adresář {cmd: cd) - Is - vypiš obsah aktuálního adresáře {cmd: dir) - cd PATH - jdi do adresáře PATH (změň aktuální adresář) Python - problémy: - Rozdíly mezi Unixem a Windowsem (/ versus \...) - V řetězcích je \ speciální znak, takže cestu C : \Users\Krtecek\Pictu res\f unny_cat. gif musíme zapsat: ' C :\\L)sers\\Krtecek\\Pictu res\\f unny_cat. gif' 2 [1] nebo r'C:\Users\Krtecek\Pictures\funny_cat.gif ' (raw string) Modul pathlib • Manipulace s cestami • Smývá rozdíly mezi Unixem a Windowsem • Základní typ Path reprezentuje cestu from pathlib import Path • Vytvoření cesty (Path) [2] Path('/home/krtecek/Pictu res/funny_cat.gif') [2]: PosixPath('/home/krtecek/Pictures/funny_cat.gif') • Domovský a aktuální adresář: [3]:I Path.home() [3]: PosixPath('/home/adam') [4] Path.cwdO [4]: PosixPath('/home/adam/School/Python') • Operátor / - sřetězení cest (doplní oddělovač / nebo \ podle operačního systému) [5] Path.homeO / Path (' Pietu res ') / PathCfunny_cat.gif') [5]: PosixPath('/home/adam/Pictures/funny_cat.gif') [6] Path.homeO / 'Pictures' / 'funny_cat.gif [6]: PosixPath('/home/adam/Pictures/funny_cat.gif') • Změna z relativní na absolutní cestu [7] Path('../../funny_cat.gif) [7]: PosixPath('../../funny_cat.gif') [8] Path('../../funny_cat.gif').absolute() [8]: PosixPath('/home/adam/School/Python/../../funny_cat.gif') [9] Path('../../funny_cat.gif').resolve() 3 [9]: PosixPath('/home/adam/funny_cat.gif') • Získání částí cesty [10] : Path('/home/krtecek/Pictures/funny_cat.gif) [10] : PosixPath('/home/krtecek/Pictures/funny_cat.gif1) [11] : Path(1/home/krtecek/Pictures/funny_cat.gif).parent [11] : PosixPath('/nome/krtecek/Pictures') [12] : Path('/home/krtecek/Pictu res/funny_cat.gif').name [12] : 1 funny_cat .gif [13] : Path('/home/krtecek/Pictures/funny_cat.gif).stem [13] : ' funnycat' [14] : Path('/home/krtecek/Pictures/funny_cat.gif).suffix [14] : '.gif1 [15]: Path('/home/krtecek/Pictures/funny_cat.gif').parts [15] : ('/', 'home', 'krteček', 'Pictures', 'funny_cat.gif') • Dotazování [16] : pi = Path('/home/krtecek/Pictures/funny_cat.gif) p2 = Path(' Pictures/funny cat.gif) [17] : pi.is_absolute() [17] : True [18] : p2.is_absolute() [18] : False [19] : p2.exists() # existuje? [19] : True [20] : p2.is_file() # existuje a je normální soubor? 4 [20] : True [21] : p2.is_dir() # existuje a je adresář? [21] : False Výpis adresáru • Metoda . iterdir - iteruje soubory a adresáře v daném adresáři • Vrací iterator, který iteruje v neurčitém pořadí - je vhodné použít sorted() [22] : p = Path('.') p. iterdir() [22] : [23] : sorted(p.iterdir()) [23] : [PosixPath('08_Soubory.ipynb'), PosixPathC08_Soubory.pdf'), PosixPath('Logo-Python.png'), PosixPath('Pietu res'), PosixPath('a.txť), PosixPathCb.txt'), PosixPath('examples'), PosixPath('funny_cat.gif'), PosixPath('nakup.txt'), PosixPath('skarabeus.txt'), PosixPath('ugly_dog.j pg')] [24] : for file in sorted(p.iterdir()): print(file) 08_Soubory.ipynb 08_Soubory.pdf Logo-Python.png Pictu res a. txt b. txt examples funny_cat.gif nakup.txt skarabeus.txt ugly_dog.jpg 5 [25] [26] [27] Chytrý výpis adresáru • Metoda . glob - iteruje soubory a adresáře vyhovující zadanému výrazu - * - libovolný počet znaků (tj. i 0 znaků) - ? - jeden libovolný znak - [A-Za-z]-jeden znak z výčtu # * = všechy soubory for file in sorted(p.glob('*')) print(file) 08_Soubory.ipynb 08_Soubory.pdf Logo-Python.png Pictu res a. txt b. txt examples funny_cat.gif nakup.txt skarabeus.txt ugly_dog.jpg # *.txt = soubory končící .txt for file in sorted(p.glob('*.txt')) print(file) a. txt b. txt nakup.txt skarabeus.txt # *n* = soubory obsahující v názvu n for file in sorted(p.glob('*n*')): print(file) 08_Soubory.ipynb Logo-Python.png funny_cat.gif nakup.txt [28]: for file in sorted(p.glob('Pictures/?ad_giraffe.*')) print(file) Pictu res/bad_giraffe.j pg Pictures/mad_giraffe.png Pictu res/sad_giraffe.j pg 6 [29]: for file in sorted(p.glob('Pictures/[bm]ad_giraffe.*')): print(file) Pietu res/bad_giraffe.j pg Pietures/mad_giraffe.png • Metoda . rglob - rekurzivní glob, tj. prohledává i podadresáře, podpodadresáře atd. [30]: for file in sorted(p.rglob('*.png')) print(file) Logo-Python.png Pietu res/mad_gi raffe.png Manipulace se souborovým systémem [31]: directory = Path('new_dir') directory [31]: PosixPath('new_dir') • Vytvoření adresáře [32]: directory.mkdir(exist_ok=True) # make directory • Přesun souboru [33]: Path('funny_cat.gif').replace(directory / 'funny_cat2.gif') [33]: PosixPath('new_dir/funny_cat2.gif') [34]: (directory/'funny_cat2.gif').replace('funny_cat.gif') [34]: PosixPathCfunny_cat.gif) • Smazání souboru [35]: Path('ugly_dog.jpg').unlink(missing_ok=True) • Smazání prázdného adresáře [36]: Path('new_dir') . rmdirO # remove directory Další funkce jsou dostupné v modulu shutil (na konci prezentace) 7 Čtení a zápis do souborů Základní rozdělení formátů • Textové (TXX HTML, CSV, JSON...) - soubor tvořen posloupností znaků Vruboun posvátný (Scarabaeus sacer), označovaný také jen krátce skarabeus či s Samička naklade larvy do kuličky uhnětené z trusu, kterou posléze zahrabe do z • Binární (ZIP, JPG, DOCX...) - soubor tvořen posloupností bajtů Poznámka: Textový soubor je vlastně binární soubor, kde každý bajt nebo skupina bajtů kóduje nějaký znak. Rozdíl je pouze v tom, jak budeme soubor číst. Základní operace se souborem • Otevření (open) • Čtení (read) • Zápis (write) • Zavření (close) = uložení změn na disk Otevření a zavření souboru v Pythonu • Explicitně - hrozí, že zapomeneme soubor zavřít a změny se neuloží [ ]: f = open('my_file.txt') # Pracujeme se souborem # Pracujeme se souborem f.close() • Pomocí bloku with - doporučený způsob (soubor se zavře automaticky na konci bloku) [ ]: with open('my_file.txt') as f: # Pracujeme se souborem # Pracujeme se souborem # Na konci bloku with se soubor automaticky zavře Funkce open • Argumenty: - Cesta k souboru (typ str nebo Path) - Mód, kódovaní... • Návratová hodnota: - Souborový objekt {filé object, filé handle) - popisuje, který soubor je otevřený, mód, kódování, ukazatel na konkrétní pozici v souboru... 8 [37]: with open('skarabeus.txť, mode='r', encoding='utf8') as f: print(f) <_io.TextIOWrapper name='skarabeus.txť mode='r' encoding='utf8'> Mód otevření textového souboru (mode) • 1 r": pro čtení {read) - defaultní mód - soubor neexistuje-> FileNotFoundError - soubor existuje -> čte od začátku • "w": pro zápis (wríte) - soubor neexistuje -> vytvoří ho - soubor existuje -> přemaže a zapisuje od začátku! • "a": pro zápis na konec (append) - soubor neexistuje -> vytvoří ho a zapisuje od začátku - soubor existuje -> doplňuje na konec Další módy: • 1 x1: pro zápis - soubor neexistuje -> vytvoří ho - soubor existuje-> FileExistsError • 1 r+1 pro čtení a zápis - soubor neexistuje-> FileNotFoundException - soubor existuje -> čte/zapisuje od začátku • 1 w+1 pro čtení a zápis - soubor neexistuje -> vytvoří ho - soubor existuje -> přemaže a čte/zapisuje od začátku Kódování souborů (encoding) • V souborech reálně nejsou uloženy znaky ale pouze bajty. • Kódování popisuje, jak se znaky zakódují do bajtů (encode) a zpátky (decode). • Příklady kódování: - UTF-8 (utf 8) - nejmodernější, dokáže zakódovat celou znakovou sadu Unicode (některé znaky se ukládají na více bajtů) - windows-1250 (cpl250) - středoevropské - windows-1252 (cpl252) - západoevropské 9 Znaky ASCII (prvních 128 znaků z Unicode) se kódují stejně ve většině kódování Defaultní kódování závisí na systému: [38] : import locale locale.getpreferredencoding() [38]: 'UTF-8' Příklad špatného rozkódování: [105]: with open('skarabeus.txť, encoding = 'cpl250') as f: print(f.read()) Vruboun posvÄ'tnÄ" (Scarabaeus sacer), oznaÄŤovanÄ" takÄ© jen krÄ'tce skarabeus ÄŤi skarab, je brouk z ÄŤeledi vrubounovitÄ (Scarabaeidae). Ľ'ije ve StL™edomoL™Ä. SamiÄŤka naklade larvy do kuliÄŤky uhnÄ>tenÄ© z trusu, kterou poslÄ©ze zahrabe do zemÄ>. VyvÄjejÄcÄ se larva se Ľl'ivÄ trusem. [106]: with open('skarabeus.txt', encoding = 'utf8') as f: print(f.read()) Vruboun posvátný (Scarabaeus sacer), označovaný také jen krátce skarabeus či skarab, je brouk z čeledi vrubounoviti (Scarabaeidae). Žije ve Středomoři. Samička naklade larvy do kuličky uhnětené z trusu, kterou posléze zahrabe do země. Vyvijejici se larva se živi trusem. Čtení z textového souboru • Funguje pouze v módech r, r+, w+ • Metoda . read přečte celý soubor (bez argumentu) nebo daný počet znaků (s argumentem) - Vrátí načtený řetězec • Po zavření souboru už nelze číst [107]:Iwith open('skarabeus.txt', mode='r', encoding = 'utf8') as f: text = f.read() text [107]: 'Vruboun posvátný (Scarabaeus sacer), označovaný také jen krátce, -Anskarabeus či skarab, je brouk z čeledi vrubounoviti \n(Scarabaeidae). Žije veL ^St ředomoři. 10 Samička naklade larvy do \nkuličky uhnětené z trusu, kterou posléze, ^zahrabe do země. \nVyvijejici se larva se živi trusem.' [108] with open('skarabeus.txť, mode='r', encoding = 'utf8') as f: first20 = f.read(20) nextlO = f.read(10) rest = f.read() print(first20) print('.....') print(nextlO) print('.....') print(rest) Vruboun posvátný (Sc arabaeus s acer), označovaný také jen krátce skarabeus či skarab, je brouk z čeledi vrubounoviti (Scarabaeidae). Žije ve Středomoři. Samička naklade larvy do kuličky uhnětené z trusu, kterou posléze zahrabe do země. Vyvijejici se larva se živi trusem. • Metoda . readline načte jeden řádek ze souboru jako řetězec. • Pokud jsme už na konci souboru, vrátí se prázdný řetězec ' '. [43]: with open('nakup.txť, encoding = 'utf8') as f: linel = f.readline() line2 = f.readline() line3 = f.readline() line4 = f.readline() # už jsme na konci souboru line5 = f.readline() # už jsme na konci souboru [44]: [linel, line2, line3, line4, line5] [44]: ['chleba\n', 'jogurt\n', '\n', '', ''] • Řádek se načítá vždy se znakem nového řádku na konci. • Tohoto se zbavíme pomocí metody . rstrip. [45]:[linel [45]: 'chleba\n' [46]: linel.rstrip() 11 [46]: 'chleba' • Metoda . reaďlines načte všechny řádky (od aktuální pozice) jako seznam [47] : with open('nakup.txt', encoding = 'utf8') as f lines = f.readlines() lines [47]: ['chleba\n', 'jogurt\n', '\n'] Čtení souboru pomocí f or • Souborový objekt je zároveň iterátor - iteruje soubor po řádcích [48] : with open('nakup.txt', mode='r', encoding = 'utf8') as f: for line in f: print(line.rstrip()) chleba jogurt • Objekt typu Path umí načíst celý soubor (jako . read, ale otevře a zavře ho za nás) [49] : Path('nakup.txt').read_text(encodingsutf8') [49]: 'chleba\njogurt\n\n' Zápis do textového souboru • Funguje pouze v módech w, a, x, r+, w+ • Metoda .w rit e zapíše řetězec do souboru - Argument musí být vždy pouze řetězec - Vrátí počet zapsaných znaků • Na konec se nevkládá automaticky nový řádek, jako u print • Po zavření souboru už nelze zapisovat [50]: with open('novy.txt', mode='w', encoding='utf8') as f: f.write('Alice') f write('Bob') f.write('Cyril') [51]: print(Path('novy.txt').read_text(encoding='utf8')) 12 AliceBobCyril • Funkci print lze přesměrovat do souboru pomocí parametru file: [52]:|with open('novy.txt', mode='w', encoding='utf8') as f: print('Alice', 10, True, file=f) print('Bob', 20, False, file=f) [53] print(Path('novy.txt').read_text(encoding='utf8')) Alice 10 True Bob 20 False • Objekt typu Path umí zapsat celý soubor (jako .write, ale otevře a zavře ho za nás) [54] Path('novy.txt').write_text('blablabla', encoding='utf8') [54] : 9 [55]:[print(Path('novy.txt').read_text(encodingsutf8')) blablabla • Můžeme otevřít několik souborů současně [56]:|with open('a.txt') as fa: with open('b.txt') as fb: with open('ab.txt', mode='w') as fab: for line_a, line_b in zip(fa, fb): print(line_a.rstrip(), line_b.rstrip(), file=fab) [57]: with open('a.txt') as fa, open('b.txt') as fb, open('ab.txt', ^mode='w') as fab: for line_a, line_b in zip(fa, fb): print(line_a.rstrip(), line_b.rstrip(), file=fab) [58] : print(Path('a.txt').read_text()) print('......') print(Path('b.txt').read_text()) print('......') print(Path('ab.txť).read_text()) Alice Bob Cyril 10 20 13 30 Alice 10 Bob 20 Cyril 30 Metody tell a seek • Metoda .tell vrací aktuální pozici ukazatele, . seek nastavuje pozici ukazatele with open('nakup.txt') as f: print(f .tellO) print(f. readlineO rst rip()) print(f .tellO) print(f. readlineO rst rip()) print(f .tellO) 0 chleba 7 jogurt 14 with open('nakup.txt') as f: f.seek(7) print(f. readlineO rst rip()) f.seek(0) print(f. readlineO rst rip()) jogurt chleba Speciální souborové objekty • sys . stdin - čte ze standardního vstupu • sys . stout - zapisuje na standardní výstup • sys . stderr - zapisuje na standardní chybový výstup import sys sys.stdout.write('ahoj') ahoj Ukončování řádků • Unix (Linux a MacOS) ukončuje řádky jedním znakem '\n ' (LF = line-feed) 14 [62] • Windows ukončuje řádky dvojící znaků 1 \r\n' (CRLF = carriage-return line-feed) • Python tento rozdíl skrývá - '\n' i 1 \r\n' se načte jako '\n' - '\n' se zapíše jako '\n' v Unixu, jako 1 \r\n' ve Windowsu • VSCode vpravo dole vypisuje kódování a ukončování řádku, umožňuje snadnou konverzi Na co si dát pozor • Kódování souborů • Řádky vždy končí bílými znaky (\n), proto je vhodné použití metod . rstrip nebo .st rip • Když soubor zavřeme, už s ním nemůžeme dále pracovat (read, write); jedině že si ho znovu otevřeme • Pokud soubor otevíráme v módu ' w', hrozí ztráta dat - současný soubor je ihned nenávratně přepsán novým prázdným souborem Binární soubory • Místo řetězců (typ str) čteme a zapisujeme bajty (typ bytes) • Binární módy otevření: 1 rb", "wb", 1 ab", "xb", 'r+b', "w+b" • Metoda . read vrací typ bytes • Metoda .write bere typ bytes with open('funny_cat.gif', mode='r+b') as f content = f.read(100) content [62]: b'GIF89a\xc8\x00\xfa\x00\xf7\xfd\x00\xl6\x0b\x04\xla\x0e\x0c\xla\xl4\xl4\xlb\xl2 \x0c\xld\xl8\xla"\xlc\xld#\xl8\xl4$\xl5\x0b%\xle!&LJ ^#*AI+\xld\xla+#\xlc+%$,!\xl5-\xla\x0c-\xlc\xl4-&).)).*%.JT01B2,*2NZ3%\xld3+%4"\xl34)\xlb61-' • Konverze mezi str a bytes pomoci metod .encode a .decode: [63] 'Náhodná věta'.encode() # UTF-8 kódování [63]: b'N\xc3\xalhodn\xc3\xal v\xc4\x9bta' [64]: 'Náhodná věta'.encode('cpl250') # Windows středoevropské kódování 15 [64]: b'N\xelhodn\xel v\xecta' [65]: b'N\xc3\xalhodn\xc3\xal v\xc4\x9bta'.decode() [65]: 'Náhodná věta' [66]: b'N\xc3\xalhodn\xc3\xal v\xc4\x9bta'.decode('cpl250') _ [66]: 'NÁ"hodnÁv vÁ>ta' Moduly Modul (module) • Soubor funkcí a proměnných, které lze importovat [67]: import math [68]: math [68]: [69] math.cos(O) [69]: 1.0 [70]: math.pi [70]: 3.141592653589793 Balíček (package) • Modul obsahující další moduly (složka s moduly) [71]: import os [72]: os [72]: [73]: os.path [73]: 16 Import pomocí from a as • from - importujeme modul z balíčku nebo proměnnou (funkci) z modulu • as - přejmenování importovaného modulu/proměnné/funkce [74]:I from os import path path [74]: from math import factorial, pi factorial(6) + pi [75] : [75]: 723.1415926535898 [76]: import numpy as np [np_ [76]: [77] : from math import factorial as fact, pi as PI fact(6) + PI [77]: 723.1415926535898 Spuštění modulu jako skriptu • Z příkazového řádku pomocí přepínače -m: $ python -m doctest Zdroje modulů / balíčků • Standardní knihovna Pythonu - Moduly přítomné při instalaci - math, os, sys... - https://docs.python.Org/3.8/library/ • PyPI - Python Package Index - Moduly doinstalovatelné např. pomocí nástoje pip - numpy, sklearn... - https://pypi.org/ • Vlastní moduly 17 - Každý pythonovský skript lze importovat jako modul Pip • Modul sloužící ke stáhnutí a doinstalování balíčků z PyPI • Spouštíme ho vždy z příkazového řádku pomocí -m (nesmí se importovat) $ python -m pip install numpy # Nainstaluj balíček numpy $ python -m pip show numpy # Vypiš verzi a info o nainstalovaném balíčku $ python -m pip search sound # Vyhledej balíčky související se zvukem $ python -m pip list # Vypiš seznam nainstalovaných balíčků $ python -m pip help # Vypiš nápovědu k pípu • V učebně A4/118 pip nefunguje (balíčky instaluje admin). Vlastní moduly • 1 soubor .py = 1 modul • Máme dlouhý program -> můžeme ho rozdělit na více modulů - Z hlavního skriptu (__main_) pak importujeme ostatní moduly - Stejný modul lze importovat do více skriptů nebo do dalších modulů Soubor examples/obsahy.py: ii ii n Modul pro výpočet obsahu různých geometrických útvarů. ii ii n import math def obsah_obdelniku(a: float, b:float) -> float: ......Vrat obsah obdélníku o stranách a, b. return a * b def obsah_ctverce(a: float) -> float: ......Vrat obsah čtverce o straně a. return a**2 def obsah_kruhu(r: float) -> float: ......Vrat obsah kruhu o poloměru r. return math.pi * r**2 [78]: from examples import obsahy 18 [79]: obsahy.obsah_ctverce(5.Q) [79]: 25.0 if__name__== 1__main__1 : • Tento blok se vykoná, pouze když modul spouštíme jako skript. • Když modul importujeme, tento blok se nevykoná. • (Toto funguje díky tomu, že pokud je modul importován, v magické proměnné __name_je název modulu; pokud je spouštěn jako skript, v proměnné_name__ je '_main__'.) Soubor ukazkove_moduly/fibonacci. py: ii ii n Modul pro generování Fibonacciho posloupnosti. from typing import List def fib(n: int) -> List[int]: ......Vrat prvních n prvků Fibonacciho posloupnosti. result = [] a, b = 1, 1 while len(result) < n: result.append(a) a, b = b, a+b return result def main() -> None: ......Interaktivní výpis Fibonacciho posloupnosti. počet = int(input('Zadej požadovaný počet prvků: ')) posloupnost = fib(pocet) print(*posloupnost, sep=', ') if__name__== '__main__' : main() • Import: [80]: from examples import fibonacci as fib [81]: fib.fib(10) [81]: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] • Spuštění z příkazového řádku: 19 $ python examples/fibonacci.py Zadej požadovaný počet prvků: 10 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 nebo $ python -m examples.fibonacci Zadej požadovaný počet prvků: 8 1, 1, 2, 3, 5, 8, 13, 21 Typická struktura pythonovského programu • Docstring - co tento modul/skript dělá • Importy • Konstanty • Funkce • if __name_ == '_main__': main() Užitečné moduly Standardní knihovna: https://docs.python.Org/3.8/library/ Python Package Index: https://pypi.org/ Modul math • Matematické funkce [82] import math math.comb(15, 3) [82]: 455 Modul cmath • Matematické funkce nad komplexními čísly [83]: r import cmath cmath.sqrt(-1) [83]: lj [84] cmath.sin(2+1j) [84]: (1.4031192506220405-0.4890562590412937J) 20 Modul random • Generování pseudo-náhodných čísel [85] import random [86] : random.random() # Náhodné reálné číslo z intervalu [6, 1) [86] : 0.15120019206798319 [87] : random.randint(0, 100) # Náhodné celé číslo z intervalu [6, 166] [87] : 47 [88] : random.choice(['červená', 'zelená ■^výběr , 'modrá', 'černá']) # Náhodný^ [88]: 'zelená' [89] : Modul datetime • Práce s časovými údaji • Základní typy: - datetime - datum a čas - timedelta - trvání - date - datum - time - čas - timezone - časová zóna from datetime import datetime, timedelta start = datetime.now() math.factorial(500_000) end = datetime.now() calculation_time = end - start print(calculation_time) 0:00:02.379853 [90]: today = datetime now().date() in_a_week = today + timedelta(weeks=l) print(f'Today is: {today}') print (fin a week it will be: {inaweek}') 21 Today is: 2020-12-03 In a week it will be: 2020-12-10 • Formátování času [91]: datetime.now().strftime('%A, %d %B %Y, %H:%M:%S') [91]: 'Thursday, 03 December 2020, 20:01:37' • Parsování času [92]: datetime.strptime('1. 7. 2000, 13:30:05', '%d. %m. %Y, %H:%M:%S') [92]: datetime.datetime(2000, 7, 1, 13, 30, 5) [93] [94] Modul itertools • Různé možnosti iterování import itertools for pair in itertools.combinations(['bilá', 'zelená', 'modrá'], 2) print(*pair) bilá zelená bilá modrá zelená modrá [95] : for pair in itertools.permutations(['bilá', 'zelená', 'modrá'], 2) print(*pair) bilá zelená bilá modrá zelená bilá zelená modrá modrá bilá modrá zelená [96] : for letter, number in itertools.zip_longest('ABCDE', [1, 2, 3],, ^fillvalue='?'): print(letter, number) A 1 B 2 C 3 D ? E ? 22 Modul sys • Funkce závislé na systému [97] [98] import sys sys.version # Verze interpretru [98]: '3.8.5 (default, Jul 28 2020, 12:59:40) \n[GCC 9.3.0]' • sys . argv - seznam argumentů z příkazového řádku - Nultý argument = název skriptu Soubor examples/suma. py: import sys print(sys.argv) suma = sum(int(x) for x in sys.argv[1:]) print(suma) • Spustíme z příkazového řádku: $ python ukazkovemoduly/suma.py 15 8 ['suma.py' 14 '1' '5', '8'] [99] Moduly os a os. path • Funkce závislé na operačním systému - os.chdir() - změň aktuální adresář • Většina dalších funkcí je i v modulu pathlib import os print(Path cwd()) os.chdir('examples') print(Path.cwd()) os.chdir('..') print(Path cwd()) /home/adam/School/Python /home/adam/School/Python/examples /home/adam/School/Python Modul shutil • Více možností než os a pathlib [100]: import shutil Path('stuff').mkdir(exist_ok=True) # Vytvoř adresář stuff 23 Path('stuff', 'foo').mkdir(exist_ok=True) # Vytvoř adresář stuff/Too Path('stuff', 'filel.txť).write_text('blabla') # Vytvoř soubor^ ^stuff/filel.txt Path('stuff', 'foo', 'file2.txt').write_text('blabla') # Vytvoř^ ■^soubor stuff/foo/file2.txt [100]: 6 [101]: shutil.rmtree('stuff') # Smaž adresář nový a všechno v něm [102] shutil.copy('Pietures/funny_cat.gif', Path.home()/'CLICK_HERE.gif') ^# Zkopíruj soubor [102]: PosixPath('/home/adam/CLICK_HERE.gif') [103]: shutil.copytree('Pictures', Path.home()/'magic_inside') # Zkopíruj, ■^adresář a všechno v něm [103]: PosixPath('/home/adam/magic_inside') [104] Zkoušíme otevřít soubor • Ask for forgiveness, not for permission. • Nezjišťujeme, jestli soubor existuje a lze ho otevřít. Prostě ho zkusíme otevřít. try: with open('neexistujici_soubor.txt') as f: print(f.read()) except FileNotFoundError: print('Soubor neexistuje.') except PermissionError: print('Nemáš právo čist soubor.') except OSError: print('Soubor se nepodařilo otevřít.') Soubor neexistuje. • OSError je obecnější typ výjimky FileExistsError, PermissionError... zahrnuje FileNotFoundError, Další užitečné moduly • argparse • requests • subprocess 24 json CSV pickle email re codecs warnings numpy matplotlib sklearn pandas