IB113 Úvod do programování a algoritmizace Cvičení 12 Jaromír Plhák Práce se soubory - Motivace • Doteď jsme pracovali jen interaktivně • Vstup z klávesnice, výstup na obrazovku • Co když chceme • Číst vstup ze souboru a/nebo • Zapisovat výstup do souboru? • Python obsahuje mnoho vestavěných funkcí pro I/O (= input/output; vstup/výstup): • https://docs.python.org/3.5/tutorial/inputoutput.html • Mějme soubor input.txt s tímto obsahem: / am a little testfile. One day, I will be awesome. Vstup (čtení) ze souboru po řádcích with open("file", "mode") as variable: # Read (or write to) the file # using the file handle object • Příklad with open("input.txt", "r") as textfile: for line in textfile: print(line , end = "") • Výstup našeho skriptu I am a little testfile. One day, 1 will be awesome. Vstup (čtení) ze souboru - znak \n • Znak\n představuje konec řádku • Mějme stejný vstupní soubor a skript 1st = [] with open("input.txt", "r") as textfile: for line in textfile: 1st.append (line) print(1st) • Výstup ['I am a little test file.\n 1 , 'One day, I will be awesome . 1 ] Vstup (čtení) ze souboru - znak \n • Ekvivalent: metoda readlinesQ • Pokud se chceme zbavit znaku \n při čtení souboru • Metoda rstripQ • Např. Ist.append(line.rstripO) Výstup (zápis) do souboru • Režim w (write): Předešlý obsah se přepíše novým! • Režim a (append): Nový obsah se zapíše na konec souboru with open("output.txt" , "mode") as f: f.write("Data to be written.") • Funkce write(s) zapíše proměnnou typu řetězec do souboru (tak jak je, nepřidává znak nového řádku) Nutnost zavírat soubory • Pokud nepoužíváte příkaz with, musíte zavírat soubory • Při zápisu se data zapisují nejprve do vyrovnávací paměti, až potom do souboru na disku (tzv. buffering) • Může se stát, že data zůstanou v bufferu, ale nestihnou se přenést do souboru • Zavření souboru je dobrý způsob, jak vyprázdnit (spláchnout do souboru) obsah bufferu External Device System Memory Disk Drive Disk Drive OS Application ■*| Application Buffer Buffer Buffer 1 Zdroj: https://www3.ntu.edu.sg/home/ehchua/programming/java/J5b_IO_advanced.htm Regulární výraz (regex, regular expression) • Řetězec znaků, který popisuje vzor v textu • Nezávislý na programovacím jazyce! • Podobné jako wildcard y správci souborů - např. *.txt (regex ekvivalent je .*\.txt), ale mnohem mocnější Your regular expression: .n.txt Your test string: file.pdf input.txt pic.jpeg output.txt Match result: file.pdf input.txt pic.jpeg output.txt Regulární výraz - analýza Libovolný znak * 0 až n-krát (greedy; nejdelší možný řetězec) \. Tečka (escaping) Your regular expression: txt Řetězec txt 3JĚ_ Your test string: file:pdf input.txt pic.jpeg output.txt Match result: file.pdf input.txt pic.jpeg output.txt Regulární výraz - použití • Hledání vzorů v textu • Náhrada řetězců v textu • Normalizace textu (odstranění bílých znaků) ■ ■ ■ • Elegantní a krátké řešení pro mnoho problémů • http://www.hovnokod.cz/422 • Nevýhody: • Nenaučíte se je za půlhodinu • Komplikovanost při nesprávném použití: • http://ex-parrot.com/~pdw/Mail-RFC822-Address.html Tahäk z http://pythex.org Special characters \ escape special characters matches any character A matches beginning of string $ matches end of string [5b-d] matches any chars '5', 'b', 'c' or'd' - matches any char except 'a', 'b\ 'c' or '6' :6J r|s matches either regex r or regex S () creates a capture group and indicates precedence Quantifiers * 0 or more (append ? for non-greedy) + 1 or more (append ? for non-greedy) ? 0 or 1 (append ? for non-greedy) {m} exactly m m occurrences {m, n} from m to n . m defaults to 0, n to infinity 1™J from m to n , as few as possible Special sequences Special sequences \A start of string matches empty string at word boundary (between \w and V \w ) \B matches empty string not at word boundary \d digit \D non-digit \s whitespace: [ \t\n\r\f\v] \s non-whitespace \w alphanumeric: [e-9a-zA-z_] \W non-alphanumeric \Z end of string \g matches a previously defined group (PiLmsux) (?:...) (?P...) (?P=) (?#...) ) (?=• (?!. (?< = (?» import re >» x = re . match("as" , "fast") # Nothing »> y = re. search("as", "fast") # Match Regulární výrazy v Pythonu • Návratová hodnota: MatchObject alebo None >» print(x) None >>> print(y) <_sre.SRE_Match object at 0x7fd4bf238238> >>> print(x) None »> print (y . group (0) ) as Úkoly • Regulární výrazy • https://is.munixz/auth/el/1433/podzim2017/IB113/um/skupiny 01 a 02/cv 12JDY • https://is.munixz/auth/el/1433/podzim2017/IB113/um/skupiny 01 a 02/slo vnik.txt • Analýza textu • https://is.munixz/auth/el/1433/podzim2017/IB113/um/skupiny 01 a 02/sh erlock.txt • Napište funkce, které analyzují text a vypíší: • Top 10 nejčastějších slov • Top 10 nejčastějších slov délky alespoň 3 znaky • Top n nejčastějších slov délky alespoň k znaků • Průměrnou délku slova / věty v textu • Zadání domácí úlohy 6 - Soubory a slovník • V ISu v odevzdáváme • https://is.muni.cz/auth/el/1433/podzim2017/IB113/ode/72006396/72006443/hw06 zadáni.py (skupina 1) • https://is.muni.cz/auth/el/1433/podzim2017/IB113/ode/72006400/72006457/hw06 zadáni.py (skupina 2) • Veškeré informace v souboru • Odevzdejte pouze tento soubor do odevzdávárny • https://is.muni.cz/auth/el/1433/podzim2017/IB113/ode/72006396/72006434/ (skupina 1) • https://is.muni.cz/auth/el/1433/podzim2017/IB113/ode/72006400/72006455/ (skupina 2) • Do čtvrtka 21. 12. 2017, 23:59