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í
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
3.12. 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 4
3.12. 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
2.12. 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 22
2.12. 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 8
2.12. 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

Ladislav Hagara | Komentářů: 3
2.12. 12:55 | Nová verze

Google Chrome 55 byl prohlášen za stabilní. Nejnovější stabilní verze 55.0.2883.75 tohoto webového prohlížeče přináší řadu oprav a vylepšení (YouTube). Opraveno bylo také 36 bezpečnostních chyb. Mariusz Mlynski si například vydělal 22 500 dolarů za 3 nahlášené chyby (Universal XSS in Blink).

Ladislav Hagara | Komentářů: 4
2.12. 11:55 | Pozvánky

Máte rádi svobodný software a hardware nebo se o nich chcete něco dozvědět? Přijďte na 135. sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.

xkucf03 | Komentářů: 1
2.12. 00:10 | Nová verze

Byla vydána verze 3.2 svobodného systému pro detekci a prevenci průniků a monitorování bezpečnosti počítačových sítí Suricata. Z novinek lze zmínit například podporu protokolů DNP3 a CIP/ENIP, vylepšenou podporu TLS a samozřejmě také aktualizovanou dokumentaci.

Ladislav Hagara | Komentářů: 0
1.12. 21:00 | Nová verze

Byla vydána beta verze Linux Mintu 18.1 s kódovým jménem Serena. Na blogu Linux Mintu jsou hned dvě oznámení. První o vydání Linux Mintu s prostředím MATE a druhé o vydání Linux Mintu s prostředím Cinnamon. Stejným způsobem jsou rozděleny také poznámky k vydání (MATE, Cinnamon) a přehled novinek s náhledy (MATE, Cinnamon). Linux Mint 18.1 bude podporován až do roku 2021.

Ladislav Hagara | Komentářů: 0
1.12. 16:42 | Nová verze

Byl vydán Devuan Jessie 1.0 Beta 2. Jedná se o druhou beta verzi forku Debianu bez systemd představeného v listopadu 2014 (zprávička). První beta verze byla vydána v dubnu letošního roku (zprávička). Jedna z posledních přednášek věnovaných Devuanu proběhla v listopadu na konferenci FSCONS 2016 (YouTube, pdf).

Ladislav Hagara | Komentářů: 2
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 771 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

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: 534×

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.