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 05:55 | IT novinky

    Organizace Open Container Initiative (OCI) (Wikipedie), projekt nadace Linux Foundation, vydala Runtime Specification 1.3 (pdf), tj. novou verzi specifikace kontejnerového běhového prostředí. Hlavní novinkou je podpora FreeBSD.

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

    Nový open source router Turris Omnia NG je v prodeji. Aktuálně na Allegro, Alternetivo, Discomp, i4wifi a WiFiShop.

    Ladislav Hagara | Komentářů: 17
    včera 05:44 | Komunita

    Na YouTube a nově také na VHSky byly zveřejněny sestříhané videozáznamy přednášek z letošního OpenAltu.

    Ladislav Hagara | Komentářů: 0
    včera 04:33 | Komunita

    Jednou za rok otevírá společnost SUSE dveře svých kanceláří široké veřejnosti. Letos je pro vás otevře 26. listopadu v 16 hodin v pražském Karlíně. Vítáni jsou všichni, kdo se chtějí dozvědět více o práci vývojářů, prostředí ve kterém pracují a o místní firemní kultuře. Můžete se těšit na krátké prezentace, které vám přiblíží, na čem inženýři v Praze pracují, jak spolupracují se zákazníky, partnery i studenty, proč mají rádi open source a co

    … více »
    SUSEMAS | Komentářů: 1
    včera 04:22 | Komunita

    Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za říjen (YouTube).

    Ladislav Hagara | Komentářů: 0
    včera 04:11 | Zajímavý článek

    Jeff Quast otestoval současné emulátory terminálu. Zaměřil se na podporu Unicode a výkon. Vítězným emulátorem terminálu je Ghostty.

    Ladislav Hagara | Komentářů: 10
    3.11. 22:55 | IT novinky

    Amazon bude poskytovat cloudové služby OpenAI. Cloudová divize Amazon Web Services (AWS) uzavřela s OpenAI víceletou smlouvu za 38 miliard USD (803,1 miliardy Kč), která poskytne majiteli chatovacího robota s umělou inteligencí (AI) ChatGPT přístup ke stovkám tisíc grafických procesů Nvidia. Ty bude moci využívat k trénování a provozování svých modelů AI. Firmy to oznámily v dnešní tiskové zprávě. Společnost OpenAI také nedávno

    … více »
    Ladislav Hagara | Komentářů: 8
    3.11. 16:22 | Pozvánky

    Konference Prague PostgreSQL Developer Day 2026 (P2D2) se koná 27. a 28. ledna 2026. Konference je zaměřena na témata zajímavá pro uživatele a vývojáře. Příjem přednášek a workshopů je otevřen do 14. listopadu. Vítáme témata související s PostgreSQL či s databázemi obecně, a mohou být v češtině či angličtině.

    TomasVondra | Komentářů: 0
    3.11. 13:22 | Nová verze

    Byl vydán Devuan 6 Excalibur. Přehled novinek v poznámkách k vydání. Kódové jméno Excalibur bylo vybráno podle planetky 9499 Excalibur. Devuan (Wikipedie) je fork Debianu bez systemd. Devuan 6 Excalibur vychází z Debianu 13 Trixie. Devuan 7 ponese kódové jméno Freia.

    Ladislav Hagara | Komentářů: 4
    3.11. 10:44 | IT novinky

    Společnost Valve aktualizovala přehled o hardwarovém a softwarovém vybavení uživatelů služby Steam. Podíl uživatelů Linuxu poprvé překročil 3 %, aktuálně 3,05 %. Nejčastěji používané linuxové distribuce jsou Arch Linux, Linux Mint a Ubuntu. Při výběru jenom Linuxu vede SteamOS Holo s 27,18 %. Procesor AMD používá 67,10 % hráčů na Linuxu.

    Ladislav Hagara | Komentářů: 1
    Jaké řešení používáte k vývoji / práci?
     (36%)
     (48%)
     (18%)
     (18%)
     (22%)
     (15%)
     (21%)
     (16%)
     (16%)
    Celkem 311 hlasů
     Komentářů: 15, poslední 2.11. 08:25
    Rozcestník

    Dotaz: Python - Pickle a shelve a kódování

    9.12.2013 20:12 alfonz mucha
    Python - Pickle a shelve a kódování
    Přečteno: 685×

    Dobrý den,

    mám tady takový dost specifický dotaz na Python a pickle/shelve. Mám kód který bych chtěl udělat pro python2 a python3. Na první pohled se zdá, že vše správně funguje, jenže po otevření dat na python 3 se objevuje chyba v kódování, která ani nejde moc dobře vyřešit.

    python2 > vytvoření souboru

    import shelve
    try:
        import dumbdbm as dumb
    except:
        from dbm import dumb

    db = dumb.open('/tmp/test',flag='c')
    database = shelve.Shelf(db,writeback=True)
    database['aa'] = {"ščř":2343, 'aaa3':'šřdd'}
    database.sync()
    database.close()

    python3 > otevření souboru

    import shelve
    try:
        import dumbdbm as dumb
    except:
        from dbm import dumb

    db = dumb.open('/tmp/test',flag='c')
    database = shelve.Shelf(db,writeback=True)
    database['aa']

    Traceback (most recent call last):
      File "/usr/lib/python3.2/shelve.py", line 111, in __getitem__
        value = self.cache[key]
    KeyError: 'aa'

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/lib/python3.2/shelve.py", line 114, in __getitem__
        value = Unpickler(f).load()
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 0: ordinal not in range(128)

    Chyba je dle mého špatně vyřešitelná na úrovni kódu vlastního a je možné jí řešit upravením __getitem__()

    /usr/lib/python3.2/shelve.py
    /usr/lib/python3.3/shelve.py > Shelf v částí Unpickler(), kde chybí kódování. Do Shelf předat kódování nejde.

    def __getitem__(self, key):
        try:
            value = self.cache[key]
        except KeyError:
            f = BytesIO(self.dict[key.encode(self.keyencoding)])
            value = Unpickler(f,encoding="???").load()
            if self.writeback:
                self.cache[key] = value
        return value

    Upravením funkce __getitem__() na na "UTF-8" funguje

    from pickle import Pickler, Unpickler
    from io import BytesIO
    def getitem(database, key):
        try:
            value = database.cache[key]
        except KeyError:
            f = BytesIO(database.dict[key.encode("UTF-8")])
            value = Unpickler(f,encoding="UTF-8").load()
            if database.writeback:
                database.cache[key] = value
        return value

    from pickle import Pickler, Unpickler
    from io import BytesIO
    getitem(database, 'aa')
    {'ščř': 2343, 'aaa3': 'šřdd'}

    Takže teď nevím, jakým způsobem bych to měl řešit.. mám dělat nějaký wrapper nebo to je normální chování?? Někdo znalý Pythonu poraďte.

    Odpovědi

    9.12.2013 20:17 alfonz mucha
    Rozbalit Rozbalit vše Re: Python - Pickle a shelve a kódování
    Blbé je, že většina tříd/dat, které se ukládají je potřeba právě otevírat jak v python2/python3 tak obsahují hodně unicode. Napadlo, mě ještě nějak upravit pickle protocol? Ale to asi také nepomůže, že ano?
    Fuky avatar 10.12.2013 13:04 Fuky | skóre: 52 | blog: 4u
    Rozbalit Rozbalit vše Re: Python - Pickle a shelve a kódování
    Příloha:
    Na Debianu s Pythonem 3.2.3-7 kód funguje bez problémů. Konstruktor Shelf má defaultně nastavený parametr keyencoding="utf-8", který se používá pro nastavení self.keyencoding.
    10.12.2013 15:31 alfonz mucha
    Rozbalit Rozbalit vše Re: Python - Pickle a shelve a kódování
    Ano... ale to je pouze pro otevření textu > ale ne pro pickle. Ta chyba se objeví až pro pickle jak je ukázáno.

    kód v Pythonu 2 zapsat soubor do /tmp/ a pak zkusit otevřít v pyhtonu 3. Takto jste to zkoušel?
    Fuky avatar 11.12.2013 11:26 Fuky | skóre: 52 | blog: 4u
    Rozbalit Rozbalit vše Re: Python - Pickle a shelve a kódování

    Omlouvám se, máte pravdu, řešil jsem to v rychlosti.

    Lze to vyřešit i bez zásahu do standartního modulu:

    def u(string):
        if (sys.version_info[0] < 3):
            return unicode(string, "utf-8")
    
        return string
    
    ...
    
    database = shelve.Shelf(db, protocol=2, writeback=True)
    
    ...
    
    database['aa'] = {u('ščř'): 2343, 'aaa3': u('šřdd')}
    

    Zkoušel jsem to s Pythonem 2.5 a 3.2.

    11.12.2013 12:12 alfonz mucha
    Rozbalit Rozbalit vše Re: Python - Pickle a shelve a kódování
    To je sice také dobré řešení, ale znamená to úpravu velkého množství kódu. Jak jsem psal potřebuji to pro další sérii tříd a to by znamenalo velké množství duplicity kódu.

    Přemýšlím, jestli to není možné reportovat jako chybu/podivné chování > v pythonu 2 totiž Pickle encoding parametr neměl. Avšak nově od asi od 3.2 má parameter encoding="acsii". Pokud by se do shelve přidal parametr/ či se připojil do části Unpickler, tak by to bylo řešitelné více systémově a bylo by to výhodnější i pro další projekty, které nepracují pouze s "ascii".

    Na druhou stranu nevím, jestli to je špatné chování nebo není.
    Fuky avatar 11.12.2013 14:03 Fuky | skóre: 52 | blog: 4u
    Rozbalit Rozbalit vše Re: Python - Pickle a shelve a kódování

    Pak lze ještě použít "obezličku", kterou jsi nastínil:

    from pickle import Pickler, Unpickler
    
    try:
        from io import BytesIO
    except:
        pass
    
    class MyShelf(shelve.Shelf):
    
        def __init__(self, db):
            shelve.Shelf.__init__(self, db, protocol=2, writeback=True)
    
        def __getitem__(self, key):
            if (sys.version_info[0] < 3):
                return shelve.Shelf.__getitem__(self, key)
    
            try:
                value = self.cache[key]
            except KeyError:
                f = BytesIO(self.dict[key.encode(self.keyencoding)])
                value = Unpickler(f, encoding="utf-8").load()
                if self.writeback:
                    self.cache[key] = value
            return value
    
    ...
    
    database = MyShelf(db)
    database['aa'] = {'ščř':2343, 'aaa3':'šřdd'}
    

    Případně lze překrýt metodu __setitem__(), v Pythonu 2, tak aby všechny řetězce převedla na unicode řetězce.

    Také mi přijde, že by bylo šikovné mít možnost nastavit kódování přímo v objektu Shelf, vzhledem k tomu, že metody, které volá tento parametr přijímají.

    11.12.2013 18:41 alfonz mucha
    Rozbalit Rozbalit vše Re: Python - Pickle a shelve a kódování
    Tusite jak spravne poslat zadost na python buglist? Ma s tim nekdo zkusenosti? Pripadne tusite jestli to lze podat jako zadost na vylepseni? Nebo je to zbytecne
    Fuky avatar 12.12.2013 11:25 Fuky | skóre: 52 | blog: 4u
    Rozbalit Rozbalit vše Re: Python - Pickle a shelve a kódování
    10.12.2013 15:33 alfonz mucha
    Rozbalit Rozbalit vše Re: Python - Pickle a shelve a kódování
    Třída Unpickler() má totiž také parameter a tam je encoding="ascii" Což pro obvykle data bez parameteru encoding "utf-8" neotevře

    Založit nové vláknoNahoru

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

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