[python] python ast.literal_eval a čeština

Petr Messner petr.messner na gmail.com
Úterý Září 15 16:45:49 CEST 2009


Ahoj,

bohužel si tvůj příklad nemohu zrovna vyzkoušet, ale myslím, že by měl
fungovat. Špatně se v něm pracuje s unicode/str a převodem mezi nimi
(proč voláš encode na str?), ale protože str() slovníku vrací ASCII
řetězec, ať je v něm cokoliv, protentokrát se to neprojeví. Nevím, co
myslíš tím "ukládá se v unicodu". Kódování řetězců ve slovníku se
nemění, možná jsi očekával něco jiného.

Každopádně, používat na jedné straně eval (a ještě k tomu poměrně
exotický modul, byť ze standardní knihovny) a na druhé metodu str,
která vůbec není určena k tomu, aby se pomocí jejího výstupu dal
zrekonstruovat vstup, je špatný a často i nebezpečný postup. Použij
prosím pickle (cPickle), nebo třeba json (ten má výhodu v čitelnosti a
ve snadné přenositelnosti mezi programy i v jiných programovacích
jazycích).

Pokud chceš mít pouze slovník uložený v souboru, můžeš použít i různé
specializované knihovny - např. mxBeeBase od Egenixu pro práci se
slovníkem (konkrétně b+tree) přímo na disku. Nebo sqlite, to už jsme
ale někde o dost jinde. Pokud tvoříš nástroj na překlad textů, podívej
se na gettext. Sám bych ale použil nejdřív ten json nebo pickle.

PS. open("db2.db") by ti nemělo otevřít soubor pro zápis.

PM

2009/9/15 Luboš Melichar <lubos.melichar na gmail.com>:
> Zdravim,
> jsem začátečník a tak dopředu prosím o trpělivost..

Začátečníkem byl každý. To akorát s chronickými začátečníky je to
trochu horší :-) Navíc někdo třeba nemá na dosah komunitu jiných
programátorů, kterých by se mohl zeptat. Na oficiálním Python
mailing-listu také chodí opravdu všechny možné dotazy.

>
> Zkouším toto, v souboru mít uložený slovník, případně pole slovníků..
>
> {'cz': 'hezký', 'en': 'nice', 'de': 'schön'}
>
> vyčíst ze souboru, převést na slovník, pracovat s ním, uložit
>
> #VYCTENI ZE SOUBORU
> f = open("db.db")
> text = unicode(f.read(),('cp1250'))
> f.close()
>
> #PRACE S DB
> db =  ast.literal_eval(text)       #prevod stringu na seznam slovniku
> db['maďarština'] = 'keřmideretvář'
>
> #ZAPIS DO SOUBORU
> text2 = str(db)
> f = open("db2.db")
> f.write(text2.encode('cp1250'))  #ulozeni
> f.close()
>
> bohuzel s cestinou mam neprekonatelny problem, ve vystupnim souboru se
> mi to uklada v unicodu.
> kodovani v obou souborech mam samozrejme cp1250.
>
> diky za popostrceni


Další informace o konferenci Python