abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 10:00 | Komunita

    V Brně na FIT VUT probíhá třídenní open source komunitní konference DevConf.CZ 2025. Vstup je zdarma, nutná je ale registrace. Na programu je celá řada zajímavých přednášek, lightning talků, meetupů a workshopů. Přednášky lze sledovat i online na YouTube kanálu konference. Aktuální dění lze sledovat na Matrixu, 𝕏 nebo Mastodonu.

    Ladislav Hagara | Komentářů: 0
    dnes 09:44 | IT novinky

    Vyloučení technologií, které by mohly představovat bezpečnostní riziko pro stát, má umožnit zákon o kybernetické bezpečnosti, který včera Senát schválil spolu s novelami navazujících právních předpisů. Norma, kterou nyní dostane k podpisu prezident, počítá rovněž s prověřováním dodavatelů technologií pro stát. Normy mají nabýt účinnosti od třetího měsíce po jejich vyhlášení ve Sbírce zákonů.

    Ladislav Hagara | Komentářů: 0
    dnes 01:11 | Nová verze

    Open source platforma Home Assistant (Demo, GitHub, Wikipedie) pro monitorování a řízení inteligentní domácnosti byla vydána v nové verzi 2025.6.

    Ladislav Hagara | Komentářů: 0
    dnes 00:55 | Nová verze

    Po Red Hat Enterprise Linuxu a AlmaLinuxu byl v nové stabilní verzi 10.0 vydán také Rocky Linux. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    včera 22:55 | Nová verze

    Bylo vydáno Eclipse IDE 2025-06 aneb Eclipse 4.36. Představení novinek tohoto integrovaného vývojového prostředí také na YouTube.

    Ladislav Hagara | Komentářů: 0
    včera 22:33 | IT novinky

    Americká filmová studia Walt Disney a Universal Pictures podala žalobu na provozovatele populárního generátoru obrázků pomocí umělé inteligence (AI) Midjourney. Zdůvodňují to údajným porušováním autorských práv. V žalobě podané u federálního soudu v Los Angeles označují firmu za „bezednou jámu plagiátorství“, neboť podle nich bez povolení bezostyšně kopíruje a šíří postavy z filmů jako Star Wars, Ledové království nebo Já, padouch, aniž by do nich investovala jediný cent.

    Ladislav Hagara | Komentářů: 1
    včera 18:33 | IT novinky

    Ultra Ethernet Consortium (UEC), jehož cílem je optimalizace a další vývoj Ethernetu s důrazem na rostoucí síťové požadavky AI a HPC, vydalo specifikaci Ultra Ethernet 1.0 (pdf, YouTube).

    Ladislav Hagara | Komentářů: 0
    včera 13:00 | IT novinky

    Francouzský prezident Emmanuel Macron chce zakázat přístup na sociální sítě pro děti do 15 let. Francie podle něj tento krok udělá sama do několika měsíců, i pokud se na něm neshodnou další státy Evropské unie. Reaguje tak na úterní vraždu vychovatelky, kterou ve východofrancouzském městě Nogent pobodal 14letý mladík. Jednotlivé sociální sítě podle něj mají možnost věk ověřit a vymáhat zákaz pomocí systémů na rozpoznávání tváří.

    Ladislav Hagara | Komentářů: 8
    včera 05:11 | IT novinky

    Byl aktualizován seznam 500 nejvýkonnějších superpočítačů na světě TOP500. Nejvýkonnějším superpočítačem zůstává El Capitan od HPE (Cray) s výkonem 1,742 exaFLOPS. Druhý Frontier má výkon 1,353 exaFLOPS. Třetí Aurora má výkon 1,012 exaFLOPS. Nejvýkonnější český počítač C24 klesl na 165 místo. Karolina, GPU partition klesla na 195. místo a Karolina, CPU partition na 421. místo. Další přehledy a statistiky na stránkách projektu.

    Ladislav Hagara | Komentářů: 0
    10.6. 22:33 | Nová verze

    Oficiálně byl vydán Android 16. Detaily na blogu a stránkách věnovaných vývojářům.

    Ladislav Hagara | Komentářů: 3
    Jaký je váš oblíbený skriptovací jazyk?
     (56%)
     (32%)
     (7%)
     (2%)
     (0%)
     (0%)
     (3%)
    Celkem 252 hlasů
     Komentářů: 16, poslední 8.6. 21:05
    Rozcestník

    Standardní knihovna pro Python - 7 (řetězce 3)

    13. 2. 2007 | Jakub Matys | Programování | 10336×

    Dnešním dílem ukončíme povídání o metodách řetězců. Uvedu některé zbývající funkce a ty, které jsem v minulých dílech opomenul.
    split([sep[,maxsplit]])

    Tato metoda pracuje přesně naopak než metoda join. Vrátí seznam slov volajícího řetězce, která jsou oddělena parametrem sep. Není-li sep zadán, nebo pokud je None, používají se jako oddělovače bílé znaky. Parametr maxsplit představuje, kolik rozdělení bude provedeno, zbytek řetězce je uložen na poslední místo v seznamu. Vrácený seznam bude tedy mít velikost maxsplit + 1. Pokud metoda narazí na dva oddělovače bezprostředně vedle sebe, vrátí prázdný řetězec. Jako oddělovač nemusí být použit jen jeden znak, zadáte-li delší řetězec, bude použit pro separaci. Má-li metoda rozdělit prázdný řetězec a byl jí předán parametr sep, vrátí jednoprvkový seznam obsahující prázdný řetězec. Pokud jí však nebude parametr předán, vrátí prázdný seznam.

    >>> "1, 2, 3, 4".split(',')
    ['1', ' 2', ' 3', ' 4']
    >>> "1, 2, 3, 4".split(", ")
    ['1', '2', '3', '4']
    >>> "1,2,3,,5,6,,,9".split(',')
    ['1', '2', '3', '', '5', '6', '', '', '9']
    >>> "1 2 3 4 5".split()
    ['1', '2', '3', '4', '5']
    >>> ''.split('a')
    ['']
    >>> ''.split()
    []
    >>>
    
    splitlines([keepends])

    Vrátí seznam řádků volajícího řetězce. Čili jako oddělovač bude použit znak přechodu na nový řádek. Pokud budete chtít ponechat znaky pro přechod na nový řádek jako součásti jednotlivých fragmentů, musíte jako argument metody předat True.

    >>> f = file("std_lib-7.html", 'r')
    >>> x = f.read(300)
    >>> x.splitlines()
    ['Standardn\xc3\xad knihovna pro Python - 7 (\xc5\x99et\xc4\x9bzce III)', 
    '', '', '<dl>', '<dt><tt>split([sep[,maxsplit]])</tt></dt>', '<dd>',
    '<p>Tato metoda pracuje p\xc5\x99esn\xc4\x9b naopak ne\xc5\xbe metoda join.
    Vr\xc3\xa1t\xc3\xad seznam slov volaj\xc3\xadc\xc3\xadho ', 
    '\xc5\x99et\xc4\x9bzce, kter\xc3\xa1 jsou odd\xc4\x9blena parametrem sep. 
    Nen\xc3\xad-li sep zad\xc3\xa1n, nebo pokud je None, ', 
    'pou\xc5\xbe\xc3\xadvaj\xc3\xad']
    >>> x.splitlines(True)
    ['Standardn\xc3\xad knihovna pro Python - 7 (\xc5\x99et\xc4\x9bzce III)\n', 
    '\n', '\n', '<dl>\n', '<dt><tt>split([sep[,maxsplit]])</tt></dt>\n', '<dd>\n',
    '<p>Tato metoda pracuje p\xc5\x99esn\xc4\x9b naopak ne\xc5\xbe metoda join.
    Vr\xc3\xa1t\xc3\xad seznam slov volaj\xc3\xadc\xc3\xadho \n', 
    '\xc5\x99et\xc4\x9bzce, kter\xc3\xa1 jsou odd\xc4\x9blena parametrem sep. 
    Nen\xc3\xad-li sep zad\xc3\xa1n, nebo pokud je None, \n', 
    'pou\xc5\xbe\xc3\xadvaj\xc3\xad']
    >>>
    
    startswith(prefix[,start[,end]]

    Vrátí True, pokud volající řetězec obsahuje prefix na začátku. Od verze 2.5 může být prefix také n-tice obsahující možnosti, které se mají porovnávat. Ke specifikaci rozsahu, který se má prohledávat, slouží parametry start a end.

    >>> s = "/usr/local/bin/python2.5"
    >>> s.startswith("/usr/local/bin")
    True
    >>> s.startswith(("/usr/bin", "/usr/sbin", "/usr/local/bin"))
    True
    >>> s.startswith("/bin",10)
    True
    >>> s.startswith("/bin",10, 12)
    False
    >>>
    
    strip([chars])

    Vrací kopii řetězce, která je oříznutá zprava i zleva. Argument chars obsahuje množinu všech znaků, které mají být oříznuty. Odstraňování znaků bude přerušeno v momentě, kdy metoda narazí na znak, který není uveden v chars. V případě, že bude parametr vynechán, budou se ořezávat pouze mezery.

    Na příkladu je vidět, že metody lstrip a rstrip (viz minulý díl) pouze rozšiřují funkci strip.

    >>> s = "www.abclinxu.cz"
    >>> s.strip("wcz.")
    'abclinxu'
    >>> s.lstrip("wcz.").rstrip("wcz.")
    'abclinxu'
    >>>
    
    swapcase()

    Vrací kopii řetězce, která má zaměněny velikosti znaků. Tj. malá písmena se změní na velká a naopak. U 8bitových znaků záleží na nastavení locale.

    >>> "MALA pismena velka PISMENA".swapcase()
    'mala PISMENA VELKA pismena'
    >>> print "MALÁ písmena velká PÍSMENA".swapcase()
    malÁ PíSMENA VELKá pÍsmena
    >>> print u"MALÁ písmena velká PÍSMENA".swapcase()
    malá PÍSMENA VELKÁ písmena
    >>>
    
    title()

    Vrací řetězec ve formátu nadpisu - všechna počáteční písmena jsou velká. Stejně jako u předcházející metody jsou 8bitové řetězce závislé na nastavení locale.

    >>> "standardni knihovna pro python".title()
    'Standardni Knihovna Pro Python'
    >>> print "česká republika".title()
    čEská Republika
    >>> print u"česká republika".title()
    Česká Republika
    >>>
    
    translate(table[,deletechars])

    Vrací nový řetězec, který je přemapován pomocí převodní tabulky table. Znaky uvedené v parametru deletechars jsou z řetězce odstraněny před jeho převodem. table musí být řetězec o 256 znacích. Tabulka se vytváří pomocí funkce string.maketrans().

    # -*- coding: iso-8859-2 -*- 
    import string
    
    line="Žluťoučký kůň pěl ďábelské ódy"
    
    table=string.maketrans("áčďéěíňóřšťúůýžÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ",\
     "acdeeinorstuuyzACDEEINORSTUUYZ")
    print line.translate(table)
    

    Použitý příklad je z webu py.cz.

    Funkce maketrans (potažmo translate) nepracovala korektně při použití systémového kódování UTF-8. Nebo alespoň mně se nepodařilo zjistit, jak s ním pracovat. Jediné, co mi Google prozradil, je, že "translate and maketrans don't love utf-8" (viz converting some french chars with python. Příklad použití utf-16, který mi však s češtinou nefungoval (francouzsky však ano :-/).

        import string
        french=u"15 résultats trouvés".encode("utf_16")
        
        sfrom = u"àâäéèêëïîôöûùüç".encode("utf_16")
        sto   = u"aaaeeeeiioouuuc".encode("utf_16")
        print french.translate( string.maketrans(sfrom,sto) )
    

    Máte-li někdo nějaké zkušenosti s kódováním utf-8, uveďte je, prosím, v diskuzi.

    upper()

    Převede všechny znaky na velké. Pro korektní převádění českých znaků v obyčejných řetězcích musíte mít správně nastavené locale.

    zfill(width)

    Vrací nový řetězec o délce width, který je zleva vyplněn znaky 0. width musí být větší než délka volajícího řetězce, jinak je vrácen tento řetězec nezměněn.

    >>> "255".zfill(5)
    '00255'
    >>>
    

    Tímto ukončíme povídání o metodách řetězců. V příštích několika dílech si budeme povídat o modulu re, to jest o regulárních výrazech. Ty slouží k vyhledávání dat v řetězcích podle určitého vzoru - ale nerad bych moc předbíhal.

           

    Hodnocení: 83 %

            špatnédobré        

    Nástroje: Tisk bez diskuse

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    13.2.2007 00:54 Kyosuke | skóre: 28 | blog: nalady_v_modre
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 7 (řetězce 3)
    Je to divný, ale ten maketrans s češtinou mi s UTF-16 funguje. ;-) Zjevně i Pythonu nějaký ten krůček do úplné unicodizace chybí. Za modul unicodedata budiž ovšem had blahoslaven a veleben. :-)
    13.2.2007 10:48 Jan Martinek | skóre: 43 | blog: johny | Brno
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 7 (řetězce 3)
    Jestli mohu doporučit, tak funkcím maketrans/translate je dobré se vyhnout, pokud si opravdu nejste naprosto jistí, že je opravdu potřebujete. Tyto funkce pracují s jednotlivými bajty (nikoli znaky), což se moc nehodí při práci s utf-8 a při práci s textem obecně. Jestliže ten maketrans s češtinou fungoval, byla to náhoda. A pokud nefungoval, nebyla to chyba pythonu ;-)

    Pro překódování řetězce odněkud někam je lepší použít encode/recode. Pro "hádání" kódování slouží Yetiho enca se svým pythonovským modulem pyenca. Pro odstranění diakritiky lze využít výše zmíněný modul unicodedata.

    Jo a díky za pěkný článek!
    13.2.2007 11:57 Kyosuke | skóre: 28 | blog: nalady_v_modre
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 7 (řetězce 3)
    Takhle nějak?
    def deaccent(unistr):
        return "".join(aChar 
                       for aChar in unicodedata.normalize("NFD", unistr) 
                       if "COMBINING" not in unicodedata.name(aChar))
    
    13.2.2007 12:01 Kyosuke | skóre: 28 | blog: nalady_v_modre
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 7 (řetězce 3)
    Á, odpovím si sám:
    def deaccent(unistr):
        return "".join(aChar 
                       for aChar in unicodedata.normalize("NFD", unistr) 
                       if not unicodedata.combining(aChar))
    bude očividně mnohem rychlejší. :-) Budu si ten modul muset prostudovat. :-D
    13.2.2007 13:28 Jan Martinek | skóre: 43 | blog: johny | Brno
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 7 (řetězce 3)
    Vida, díky - tvůj postup naprosto precizně odstraní akcenty :-) Zkusil jsem si s tím taky pohrát a dostal jsem se do svízele s tím, že vlastně nechápu, k čemu se to vlastně používá. Má to smysl možná tehdy, když musí být výsledkem ascii řetězec, a pak pouhé odstranění akcentů nestačí. Zde je ukázka několika možností:
    #!/usr/bin/env python
    #coding: utf-8
    
    import unicodedata
    
    def deaccent(unistr):
        return "".join(aChar 
                       for aChar in unicodedata.normalize("NFD", unistr) 
                       if not unicodedata.combining(aChar))
                       
    old_cz = u'áÁčČďĎěĚéÉíÍňŇóÓřŘšŠťŤúÚůŮýÝžŽ'
    old_fr = u'ôœùûüÿàâçéèêëïîÔŒÙÛÜŸÀÂÇÉÈÊËÏÎ'
    old = old_cz + old_fr
    print old
    print deaccent(old)
    print deaccent(old).encode('ascii', 'replace')
    print deaccent(old).encode('ascii', 'ignore')
    print unicodedata.normalize('NFKD', old).encode('ascii', 'ignore')
    print unicodedata.normalize('NFKD', old).encode('ascii', 'replace')
    
    Výsledek je toto:
    áÁčČďĎěĚéÉíÍňŇóÓřŘšŠťŤúÚůŮýÝžŽôœùûüÿàâçéèêëïîÔŒÙÛÜŸÀÂÇÉÈÊËÏÎ
    aAcCdDeEeEiInNoOrRsStTuUuUyYzZoœuuuyaaceeeeiiOŒUUUYAACEEEEII
    aAcCdDeEeEiInNoOrRsStTuUuUyYzZo?uuuyaaceeeeiiO?UUUYAACEEEEII
    aAcCdDeEeEiInNoOrRsStTuUuUyYzZouuuyaaceeeeiiOUUUYAACEEEEII
    aAcCdDeEeEiInNoOrRsStTuUuUyYzZouuuyaaceeeeiiOUUUYAACEEEEII
    a?A?c?C?d?D?e?E?e?E?i?I?n?N?o?O?r?R?s?S?t?T?u?U?u?U?y?Y?z?Z?
     o??u?u?u?y?a?a?c?e?e?e?e?i?i?O??U?U?U?Y?A?A?C?E?E?E?E?I?I?
    
    Jak je vidět, s češtinou celkem není problém, a proto pro ni lze na netu najít tolik více či méně korektních postupů. Ale zkusil jsem francouzštinu a pro ascii reprezentaci by to ještě chtělo spravit ty ligatury.
    13.2.2007 13:41 Kyosuke | skóre: 28 | blog: nalady_v_modre
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 7 (řetězce 3)
    Tak s těmi ligaturami bacha, ono v některých jazycích je to plnohodnotné písmeno, takže jakékoli odstraňování čehokoliv je locale-dependent. ;-)
    13.2.2007 14:47 Jan Martinek | skóre: 43 | blog: johny | Brno
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 7 (řetězce 3)
    Aha, máš pravdu:
    >>> import unicodedata
    >>> unicodedata.name(u'Œ')
    'LATIN CAPITAL LIGATURE OE'
    >>> unicodedata.name(u'Æ')
    'LATIN CAPITAL LETTER AE'
    
    Konverze do ASCII (nebo spíš latin-1?) by IMHO locale-dependent být nemusela. Ale nejsem si jistý. Za přečtení stojí tohleto: http://effbot.org/zone/unicode-convert.htm Uf. Radši akcenty nikdy neodstraňovat.
    13.2.2007 15:21 Kyosuke | skóre: 28 | blog: nalady_v_modre
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 7 (řetězce 3)
    Mnojo, jazykověda je ještě lepší zábava než linuxový kernel. :-D ;-)
    13.2.2007 15:43 Jan Martinek | skóre: 43 | blog: johny | Brno
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 7 (řetězce 3)
    Hehe :-) A když už jsme u těch akademických debat, zdá se, že pro převod do ASCII se při normalizaci víc hodí parametr 'NFKD' (místo 'NFD'), přestože ničí část informace. Například:
    >>> ctvrtka = u'\N{VULGAR FRACTION ONE QUARTER}'
    >>> print unicodedata.normalize('NFKD', ctvrtka)
    1⁄4
    >>> print unicodedata.normalize('NFD', ctvrtka)
    ¼
    
    Bohužel, někteří často pomocí skriptů převádějí do ASCII názvy souborů a adresářů. Takže když bude v názvu jedna čtvrtina, vyrobí se z toho nadbytečné lomítko, které v cestě nadělá paseku. No teoreticky by se to stát mohlo, no ne? :-)
    13.2.2007 15:47 Kyosuke | skóre: 28 | blog: nalady_v_modre
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 7 (řetězce 3)
    Diskuse se začíná nebezpečně stáčet směrem k založení nového projektu na Sourceforgi. :-D

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.