11.1. Práce s textem¶
Pokročilá práce s řetězci
Čtení a zápis do souborů
input_file = open("input.txt", "r") # otevreni souboru pro ctenicontent = input_file.read() # nacteni celeho obsahu souboru do retezcelines = input_file.readlines() # nacteni souboru souboru jako seznam radkuoutput_file = open("output.txt", "w") # otevreni souboru pro zapisoutput_file.write("Some sentence.") # zapis retezce do souborusome_file.close() # uzavreni souboru# doporucovana konstrukce with, ktera zajisti automaticke uzavreni souboru:with open("input.txt", "r") as input_file: pass
11.1.1. “head” / “tail”¶
Načtěte soubor alice-in-wonderland.txt anaprogramujte funkce:
head
, která vypište prvníchn
řádků obsahu souboru,tail
, která vypište posledníchn
řádků obsahu souboru.
def head(filename: str, n: int) -> None: passhead("alice-in-wonderland.txt", 3)## ALICE’S ADVENTURES IN WONDERLAND#def tail(filename: str, n: int) -> None: passtail("alice-in-wonderland.txt", 3)# all their simple sorrows, and find a pleasure in all their simple joys,# remembering her own child-life, and the happy summer days.#
11.1.2. Každé druhé slovo¶
Načtěte soubor lorem-ipsum.txt avypište každé druhé slovo, které se vněm nachází.
def every_second(filename: str) -> None: passevery_second("lorem-ipsum.txt")# ipsum sit consectetur elit, do tempor ut et magna Rhoncus purus# enim Risus tristique aliquet. in quam orci eu Scelerisque imperdiet# fermentum vel porta
11.1.3. Nejčastější slova¶
Načtěte soubor sherlock-holmes.txt avypište 10 nejčastěji se vyskytujících slov vtextu. Pro zajímavost se omeztepouze na slova délky 3 a více.
def most_freq_words(filename: str) -> None: passmost_freq_words('sherlock-holmes.txt')
11.1.4. Průměrný počet slov ve větě¶
Analyzujte text vsouborualice-in-wonderland.txt a vraťteprůměrný počet slov ve větě.
def average_sentence_len(filename: str) -> float: passprint(average_sentence_len('alice-in-wonderland.txt'))
11.1.5. Frekvence písmen¶
Proveďte frekvenční analýzu některého zvýše uvedených souborů. Vypište,kolikrát se vtextu vyskytují jednotlivá písmena.
Tip: pro ověření, že je daný znak písmeno, můžete použít funkci isalpha
.
def freq_analysis(filename: str) -> None: passfreq_analysis('my_file.txt')
11.1.6. Podmíněná frekvenční analýza¶
Pro každé písmeno vtextu vypište 5 písmen, které za ním následují nejčastěji.Můžete využít například soubordevatero_pohadek.txt.
def cond_freq_analysis(filename: str) -> None: passcond_freq_analysis('devatero_pohadek.txt')
11.1.7. Imitace textu¶
Napište funkci text_imitation(filename, length)
, která analyzuje textvsouboru filename
. Funkce pak vygeneruje pseudo-náhodný text olength
slovech. Text se generuje po slovech. Další generované slovo se náhodně vybíráztěch, které vpůvodním textu po naposledy vygenerovaném slově následovaly.
def text_imitation(filename: str, length: int) -> None: passtext_imitation('devatero_pohadek.txt', 10)
11.1.8. Imitace textu po písmenech¶
Upravte vaše předchozí řešení tak, aby vytvářelo slova a to po jednotlivýchpísmenech.
11.1.9. Analýza jmen¶
Načtěte soubor jmena.csv. Implementujte funkcimost_common_names(filename)
, která ze souboru vypíše count
nejčastějiužívaných jmen (globálně).
def most_common_names(filename: str, count: int) -> None: passmost_common_names('jmena.csv', 10)
11.1.10. Analýza jmen II¶
Upravte předchozí funkci tak, aby jako parametr brala ještě seznam roků. Funkcevypíše count
nejčastějších jmen vletech, které dostane vseznamu.
def most_common_names_years(filename: str, count: int, years: List[int]) -> None: passmost_common_names_years('jmena.csv', 10, [2005, 1996, 2003])
11.1.11. Zpracování jmen¶
Napište funkce, která přečte všechny jména v souboruNAMES.txt, zpracuje je tak, aby měla velké pouzeprvní počáteční písmeno (JOHN -> John) a seřadí je v abecedě. Po té je uložído jiného souboru.
def process_names(input_filename: str, output_filename: str) -> None: passprocess_names('NAMES.txt', 'names.txt')
11.2. Regulární výrazy¶
Regulární výraz (regular expression), označovaný též zkráceně jakoregexp či regex je speciální řetězec znaků, který představuje určitývzor pro textové řetězce. Regulární výraz je tedy nějaký obecný popis,který vždy odpovídá určité skupině řetězců (např.: email, html tag,datum…). Můžeme je využít ke kontrole vstupu, hledání a nahrazování vtextu, parsování html a mnoha dalším úkolům.
O regulárních výrazech bylo mnoho napsánu a existuje mnoho návodů a taháků:regularnivyrazy.info,python.org,Wikipedia,Cheat Sheet,OverAPI a další.Existují i weby, kde si lze práci s regulárními výrazy snadno vyzkoušetonline (např.: pythex.org). Můžete je taképrocvičit na Tutorovi.
Pro práci s regulárními výrazy v Pythonu lze využít knihovnu re
Raw string
Protože zpětná lomítka mají speciální význam také v regulárních výrazech(a tedy jich obvykle obsahují hodně), vyhovovalo by nám více takové chování,kdy by se zpětná lomítka v řetězci nijak neinterpretovala.Toho lze dosáhnout přidáním znaku r těsně před samotný řetězec, např. r’rawstring with ‘.
11.2.1. Celá čísla¶
Napište funkci is_integer(string)
, která vrátí True
pokud zadanýstring
je celé číslo.
import redef is_integer(string: str) -> bool: passdef test_is_integer() -> None: assert is_integer("42") == True assert is_integer("-42") == True assert is_integer("4a2") == False
11.2.2. Čísla¶
Napište funkci is_number(string)
, která vrátí True
pokud zadanýstring
je číslo.
import redef is_number(string: str) -> bool: passdef test_is_number() -> None: assert is_number("42.01") == True assert is_number("-42") == True assert is_number("4.b") == False assert is_number("42.") == False
11.2.3. Jména¶
Využijte soubor jmen, které jste vytvořili ve cvičeníZpracování jmen. Funkce search_in_file(pattern, filename)vypíše z daného souboru všechny řádky, které odpovídají vzoru. Pomocí tétofunkce vypište všechny jména která
obsahují
oo
obsahují alespoň 3 znaky
o
(ne nutně po hned sobě)obsahují pouze samohlásky
obsahují pouze souhlásky [stačí přidat jediný znak do předchozího vzoru]
začínají na
B
neboD
a končí na w nebo zobsahují buď
inf
neborec
kromě prvního a posledního písmene obsahují pouze samohlásky a mají přesně 5 písmen
začínají a končí na
A
a mají nejvýše 4 písmenazačínají na
N
neboM
a obsahují alespoň 5 samohlásekkromě
a
můžou obsahovat nejvýše 2 jiná písmena, což ale můžou být jediněl
,m
nebon
# vypise radky, ktere splnuji zadany vzordef search_in_file(pattern: str, file_name: str) -> None: with open(file_name) as f: lines = f.read().split('\n') # nacteme vsechny radky do seznamu for line in lines: # prochazime radky a hledame shodu if re.search(pattern, line): print(line)search_in_file(r'.*', 'names.txt')
11.2.4. Zpracování CSV¶
Ze souboru students.csv vypište následujícístatistiky:
seznam všech křestních jmen
seznam všech použitých křestních jmen (bez opakování) s počtem jejich výskytů
seznam všech použitých křestních jmen s počtem jejich výskytů začínajícídaným písmenem
řaďte jména podle abecedy
pro každého člověka informaci o studovaném semestru v následujícím formátu:
50668: 1. semestr 1. rocniku
,43583 : 5. semestr 1 cyklu
další informace (třeba rozložení mezi fakultami)
names("students.csv", "s")# Samuel 3# Sandra 1# Sebastian 1semesters("students.csv")# 50668 : 1. semestr 1 rocniku# 421714: 2. semestr 1 rocniku# 564138: 1. semestr 1 rocniku# 43583 : 5. semestr 1 cyklu# 81908 : 5. semestr 1 cyklu# 844632: 1. semestr 1 rocniku# 798639: 1. semestr 1 rocniku# ....