Tyto stránky již nejsou udržovány. Obsah je postupně přesouván/aktualizován na adrese chytrosti.marrek.cz.
200/735
Obsah:
Vytvořte aplikaci, která čte uživatelem zadaný soubor a zapisuje do dalšího uživatelem zadaného souboru. Aplikace provádí následující akce:
Aplikace se bude ovládat interaktivně pomocí jednoduchého menu.
    1) Převod na malá písmena
    2) Nahrazení znaků
    3) Statistika souboru 
    4) Generování náhodného textu
    5) Konec
    1-5> 1
    >>> zadej jmého vstupního souboru: text
    >>> zadej jmého výtupního souboru: /dev/stdout
    python 
    python je dynamický objektově orientovaný skriptovací
    programovací jazyk, který v roce 1991[1] navrhl guido van rossum.
    python je vyvíjen jako open source projekt, který zdarma nabízí
    instalační balíky pro většinu běžných platforem (unix,
    windows, mac os); ve většině distribucí systému linux je python
    součástí základní instalace.
    mimo jiné je v něm implementován aplikační server zope, instalátor a
    většina konfiguračních nástrojů linuxové distribuce firmy red hat.
    -----------------------------------------------------------------------
    1) Převod na malá písmena
    2) Nahrazení znaků
    3) Statistika souboru 
    4) Generování náhodného textu
    5) Konec
    1-5> 2
    >>> zadej znak, který se má nahradit: a
    >>> zadej znak, kterým se má nahradit: @
    >>> zadej jmého vstupního souboru: text
    >>> zadej jmého výtupního souboru: /dev/stdout
    Python 
    Python je dyn@mický objektově orientov@ný skriptov@cí
    progr@mov@cí j@zyk, který v roce 1991[1] n@vrhl Guido v@n Rossum.
    Python je vyvíjen j@ko open source projekt, který zd@rm@ n@bízí
    inst@l@ční b@líky pro většinu běžných pl@tforem (Unix,
    Windows, M@c OS); ve většině distribucí systému Linux je Python
    součástí zákl@dní inst@l@ce.
    Mimo jiné je v něm implementován @plik@ční server Zope, inst@látor @
    většin@ konfigur@čních nástrojů Linuxové distribuce firmy Red H@t.
    -----------------------------------------------------------------------
    1) Převod na malá písmena
    2) Nahrazení znaků
    3) Statistika souboru 
    4) Generování náhodného textu
    5) Konec
    1-5> 3
    >>> zadej jmého vstupního souboru: text
    A      27 ********************************
    Á       5 ******
    B       6 *******
    C      11 *************
    Č       4 ****
    D       8 *********
    E      23 ***************************
    É       3 ***
    Ě       7 ********
    F       3 ***
    G       3 ***
    H       8 *********
    I      24 *****************************
    Í      12 **************
    J      11 *************
    K      12 **************
    L      11 *************
    M      13 ***************
    N      33 ****************************************
    O      30 ************************************
    P      13 ***************
    R      23 ***************************
    S      17 ********************
    Š       3 ***
    T      25 ******************************
    U      12 **************
    Ů       1 *
    V      17 ********************
    W       2 **
    X       3 ***
    Y      10 ************
    Ý       5 ******
    Z       5 ******
    Ž       1 *
    1       3 ***
    9       2 **
    řádků: 11, slov: 66, znaků: 466
    -----------------------------------------------------------------------
    1) Převod na malá písmena
    2) Nahrazení znaků
    3) Statistika souboru 
    4) Generování náhodného textu
    5) Konec
    1-5> 4
    >>> zadej jmého výtupního souboru: /dev/stdout
    >>> zadej počet slov: 20
    opa ulide y be p uwegovy e kutuve pidyfel apugyve r e utuxoli mypacogo ykukyw
    orobusij edocy w vyjig ehotyzi 
    -----------------------------------------------------------------------
    1) Převod na malá písmena
    2) Nahrazení znaků
    3) Statistika souboru 
    4) Generování náhodného textu
    5) Konec
    1-5> 5`--> stáhnout
#!/usr/bin/python
# -*- coding: utf8 -*-
from Tkinter import *
##################################################
### Definice funkcí 
##################################################
### Hlavní programová smyčka
##################################################`--> stáhnout
Jádrem programu bude smyčka ve které se uživatele stále dokola práme, co se má udělat:
while True:
    print "1) Převod na malá písmena"
    print "2) Nahrazení znaků"
    print "3) Statistika souboru "
    print "4) Generování náhodného textu"
    print "5) Konec"
    try:
        volba = int(raw_input("1-5> "))
        if volba == 1:
            prevod()
        elif volba == 2: 
            nahrazeni()
        elif volba == 3: 
            statistika()
        elif volba == 4:
            nahodnyText(40)
        elif volba == 5: 
            exit(0)
        else:
            print "\n>>>> Zadej číslo od 1 do 5\n"
    except ValueError: 
        print "\n>>>> Zadej číslo od 1 do 5\n"
    except EOFError: 
        exit(0)`--> stáhnout
Teď už jen stačí napsat funkce pro obsluhu jednotlivých "akcí" -- tedy
prevod(), nahrazeni(), statistika() a nahodnyText().
Soubor je nejprve třeba otevřít. To se děje pomocí funkce open().
ovladac = open('cesta/k/souboru', mod)`--> stáhnout
Kde mod je buď "r" pro čtení, "w" pro zápis nebo "a" pro přidání do
souboru. V režimu pro zápis je souboru vždy smazán (pokud existuje) a vytvořen
nový, prázdný. V režimu pro přidání se souboru otevře pro zápis, ale jeho obsah
se nesmaže a ukazatel se nastaví na konec souboru.
ovladac je objekt, přes který se se souborem komunikuje:
ovladac.read(pocet)ovladac.readline()ovladac.readlines()Pokud dojdeme na konec souboru vrátí tyto metody vždy prázdný řetězec, tedy ''.
ovladac.write(obsah)ovladac.writelines(seznam)'\n'.
ovladac.close()Zde pracujeme simultánně s dvěma otevřenými soubory jeden (vstupní) je otevřen
pro čtení, druhý (výstupní) je otevřen pro zápis. Vždy načteme řádek, pomocí
metody .lower() převedeme na malá písmena a zapíšeme do výstupního souboru. 
O ošetření chyb se postará blok try: except. 
def prevod():
    """Funkce převede všechna písmena v soboru na malá"""
    try:
        # otevřu:
        inName = raw_input(">>> zadej jmého vstupního souboru: ")
        inFile = open(inName,"r")
        outName = raw_input(">>> zadej jmého výtupního souboru: ")
        outFile = open(outName,"w")
        # čtu do konce souboru
        while True:
            # čtu:
            radek = inFile.readline()
            # na konci souboru mi funkce vrátí prázdný řetězec 
            if radek == '':
                break
            # zapisuji
#            radek = radek.decode('utf-8')
#            radek = radek.upper()
#            radek = radek.encode('utf-8')
            outFile.write(radek.decode('utf-8').upper().encode('utf-8'))
            outFile.write(radek.decode('utf-8').lower().encode('utf-8'))
        # uzavřu soubory
        inFile.close()
        outFile.close()
    except IOError:
        print "\nERROR > Něco je špatně:"
        print "ERROR > zkontroluj si jméno souboru a přístupová práva\n"`--> stáhnout
Pokud požadujete, aby fungovala správně i čeština je nutné následující:
localeZde je vše stejné jako u převodu na malá písmena, takže uvedu jen to co se liší. Opět jsou otevřené dva soubory najednou -- jeden pro čtení, druhý pro zápis. Jen se uživatel musíme navíc zeptat na znak nahrazovaný a nahrazující.
Nabízím zde řešení, kdy se soubor zpracovává po znacích.
...
...
    while True:
        # čtu:
        znak = inFile.read(1)
        # na konci souboru mi funkce vrátí prázdný řetězec 
        if znak == '':
            break
        # zapisuji
        if znak == znakStary:
            outFile.write(znakNovy)
        else:
            outFile.write(znak)
...
...`--> stáhnout
To je ale hodně nevýhodné při práci s českým textem ve více-bytovém kódování jak o je třeba UTF-8. V tomto případě se jeví se vhodnější zpracovávat soubor po řádcích (stejně jako v předchozím případě) a použít na každý řádek metodu str.replace.
...
...
    while True:
        radek = inFile.readline()
        if radek == '':
            break
        outFile.write(radek.decode('utf-8').replace(znakStary,znakNovy).encode('utf-8'))
...
...
`--> stáhnout
Statistika souboru vypisuje
Soubor budeme zpracovávat pořádcích -- to nám umožní počítat řádky a slova.
Dále pak každý řádek zpracujme po jednotlivých znacích. Pro ukládání počtu jednotlivých znaků použijeme [slovník][py_slovnik]. Klíčem budou jednotlivé znaky.
Při výpisu počtu znaků je potom vytvořen jednoduchý bargraf, který počet znaků vizualizuje.
f = open('/dev/stdin', 'r')
pocetRadku = 0
pocetZnaku = 0
pocetSlov = 0
# slovník do kterého ukládám četnosti znaků jednotlivých písmen
# klíčem je vždy písmeno
cetnostZnaku={}
while True:
    radek=f.readline()
    if radek == '':  
        break       # protože jsem došel na konec souboru
    radek = radek.decode('utf-8') # aby se znaky s diakritikou chovali jako písmeno
    pocetRadku = pocetRadku + 1
    delka=len(radek)
    pocetZnaku += delka         
    pocetSlov += len(radek.split()) # řádek rozdělím na slova
    for znak in radek:  # řádek zpracovávám po znacích
        if znak in (' ','\t', '\n' ):
            continue    # bílé znaky přeskoč
        # četnost jednotlivých znaků
        if cetnostZnaku.has_key(znak):
            cetnostZnaku[znak] += 1
        else:
            cetnostZnaku[znak] = 1          
print "----  četnosti znaků    -------------"
for znak in cetnostZnaku.keys():
    pocet = 60 * cetnostZnaku[znak] / max(cetnostZnaku.values())
    graf = '*' * pocet
    print "{0:2s}{1:10} |{2}".format( znak, cetnostZnaku[znak], graf )
print "-------------------------------------"
print "počet řádků:", pocetRadku
print "počet slov:", pocetSlov
print "počet znaků:", pocetZnaku
print "-------------------------------------"`--> stáhnout
Při generování náhodného textu požadujeme aby
Vytvoříme tedy seznam souhlásek a samohlásek a budeme z nich náhodně na-střídačku vybírat vždy jeden znak. Také náhodně určíme jestli samohlásky/souhlásky jsou sudé/liché (řádek 12 a 14). Celé to provádíme v náhodně dlouhém cyklu čímž zajistíme náhodnou délku slov.
   1 import random
   2 
   3 ...
   4 
   5 def nahodnyText(pocetSlov):
   6     samohlasky = 'aeiyou'
   7     souhlasky ='qwrtpsdfghjklzxcvbnm'
   8 
   9     for i in range(pocetSlov):
  10         #jedno slovo
  11         delkaSlova = random.randint(1,8)
  12         zacatek = random.randint(0,1)  # zacinam samohlaskou nebo souhlaskou?
  13         for i in range(delkaSlova):
  14             if i % 2 == zacatek:       # ztrida se samohlaska a souhlaska
  15                 sys.stdout.write( random.choice(souhlasky) )
  16             else:
  17                 sys.stdout.write( random.choice(samohlasky) )
  18         sys.stdout.write(' ')
  19     sys.stdout.write('\n\n')`--> stáhnout