Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: oTa 23. 07. 2015, 09:57:06
-
Ahoj pánové, chtěl bych se zeptat, jak můžu uchovat nějaké nastavení po ukončení programu pro příští spuštění. Mám třídu a v ní mám 3 proměnné, které potřebuji uchovat.
self.rgb = 1
self.bck = 1
self.txt = 45
Neporadil by mi prosím někdo ? Děkuji za pomoc.
-
Co třeba použít JSON -- knihovny jsou připravené a budeš mít validaci vstupu v ceně
-
pickle
-
shelve
-
Ahoj, prostuduj toto: https://docs.python.org/3/library/pickle.html
to je to, co psal @karel (tzv. serializace)
-
Nemá smysl používat pickle, když shelve je nástavba nad ním vymyšlená přesně pro tyhle případy. Viz http://www.py.cz/Shelve
-
Případně pokud bys chtěl něco vhodného pro více threadů a komerční nasazení, tak http://www.zodb.org/
-
Ja pouzivam ConfigParser (sucast standard library) a uchovavam nastavenia v INI-suboroch, ktore su normalne citatelne.
Tak napriklad:
config.py
from ConfigParser import ConfigParser
def write_config():
cfgf = open('c:\work\config.ini','w')
# config for Class01
cp.add_section('MyClass01_config')
cp.set('MyClass01_config','rgb',1)
cp.set('MyClass01_config','bck',10)
cp.set('MyClass01_config','txt',45)
# config for Class02
cp.add_section('MyClass02_config')
cp.set('MyClass02_config','foo','spam')
cp.set('MyClass02_config','bar','eggs')
cp.write(cfgf)
cfgf.close()
def print_config():
cp.read('c:\work\config.ini')
print "Configuration: "
print "---------------"
for section in cp.sections():
print "[%s]" % section
for option in cp.options(section):
print "%s = %s" % (option, cp.get(section, option))
if __name__=="__main__":
cp = ConfigParser()
write_config()
print_config()
Po spusteni
C:\Work>python config.py
vytvori subor config.ini a vypise jeho obsah:
Configuration:
---------------
[MyClass01_config]
rgb = 1
bck = 10
txt = 45
[MyClass02_config]
foo = spam
bar = eggs
Poznamka: Na Python 3.x som sice este nepresiel, ale ConfigParser je v standardnej verzii aj tam - pozri:
https://docs.python.org/3/library/configparser.html
-
Ja pouzivam ConfigParser (sucast standard library) a uchovavam nastavenia v INI-suboroch, ktore su normalne citatelne.
To není to samé. Shelve / ZODB uchovává celé objekty bez toho, aniž by ses musel starat o serializaci/deserializaci. Pokud to chceš jen používat na pozastavení stavu programu, abys ho při příštím spuštění měl přesně ve stavu, v jakém jsi ho opustil, tak je shelve/ZODB ideální, protože samo serializuje objekty.
-
Je mi to jasne.
- ak chce OP ukladat zlozite datove struktury:
- ak to nepotrebuje mat v ludsky-citatelnej forme moze pouzit pickle, shelve, ....
- ak to chce mat v ludsky-citatelnej forme moze pouzit YAML, JSON
- ak chce OP ukladat globalne nastavenia programu, tak je idealny ConfigParser a INI-subor v ludsky-citatelnej forme
Mne sa podla dotazu zda, ze OP potrebuje globalne nastavenia programu.
-
Je mi to jasne.
- ak chce OP ukladat zlozite datove struktury:
- ak to nepotrebuje mat v ludsky-citatelnej forme moze pouzit pickle, shelve, ....
- ak to chce mat v ludsky-citatelnej forme moze pouzit YAML, JSON
- ak chce OP ukladat globalne nastavenia programu, tak je idealny ConfigParser a INI-subor v ludsky-citatelnej forme
Mne sa podla dotazu zda, ze OP potrebuje globalne nastavenia programu.
Podle mě má INI význam tenkrát, pokud chceme mít data nejenom v lidsky čitelné podobě, ale chceme umožnit i editaci. YAML je exot (nic proti), JSON je super v tom, že je přenositelný i mimo Python a dá se validovat (JSON Schema), dá se v případě potřeby číst i editovat ručně, ale není to až tak moc komfortní, spíše nouzovka. Shelve jsem nikdy nepoužil a nemám k tomu moc motivaci, pickle je pohodlné, pokud se používá jenom z Pythonu. Problém nastává tenkrát, když se změní třeba název třídy, která tam byla původně uložená. Pak se ušetřená práce vrátí zpět jako bumerang.
Obecně - pokud je to jenom trochu možné, použiju JSON. Od 2.6 je v Pythonu podpora standardně, nejsem vázaný na Python (už se mi stalo, že jsem potřeboval zpracovávat mezivýstupy v jiném jazyce - konkrétně ve Scale a stejně jsem je konvertoval z pickle do JSONu). Serializaci složitějších objektů (na což se pickle nebo ZODB samozřejmě docela hodí) se snažím vyhýbat, podle mě to ve většině případů není moc dobrý nápad.
-
...YAML je exot (nic proti)...
YAML som pouzil par krat v Ruby (ktory ma v standardnej kniznici YAML aj JSON).
Myslel som teda, ze Python ma YAML tiez v standardej kniznici, ale neni tomu tak.
-
ZODB je overene casom a vyborne zdokumentovane. Ak potrebujete transparentne ulkladanie stavu objektov v pythone je to najlepsia volba. Je tu moznost pouzit napr. aj postgres ako backend pre ZODB :) + ZODB je ACIC databaza teda ma aj transakcie, ale aj vela inych features
-
Shelve jsem nikdy nepoužil a nemám k tomu moc motivaci, pickle je pohodlné, pokud se používá jenom z Pythonu.
Shelve je jen syntax suggar na pickle.
ZODB je overene casom a vyborne zdokumentovane
Ověřené časem ano, ale ta dokumentace docela pokulhává. Ne že by nebyla, ale je roztříštěná a ve spojení se ZEO clusterem je tam pár věcí, které umí překvapit.
-
...YAML je exot (nic proti)...
YAML som pouzil par krat v Ruby (ktory ma v standardnej kniznici YAML aj JSON).
Myslel som teda, ze Python ma YAML tiez v standardej kniznici, ale neni tomu tak.
O to mi nešlo. Ten formát zná poměrně málo lidí a podle mě je méně intuitivní než třeba INI.
-
Shelve jsem nikdy nepoužil a nemám k tomu moc motivaci, pickle je pohodlné, pokud se používá jenom z Pythonu.
Shelve je jen syntax suggar na pickle.
ZODB je overene casom a vyborne zdokumentovane
Ověřené časem ano, ale ta dokumentace docela pokulhává. Ne že by nebyla, ale je roztříštěná a ve spojení se ZEO clusterem je tam pár věcí, které umí překvapit.
namiesto ZEO je uz dnes lepsie pouzit RelStorage backend (postgresql/mysql/oracle) ktorym zaroven vyriesite aj backup/restore
-
...YAML je exot (nic proti)...
YAML som pouzil par krat v Ruby (ktory ma v standardnej kniznici YAML aj JSON).
Myslel som teda, ze Python ma YAML tiez v standardej kniznici, ale neni tomu tak.
O to mi nešlo. Ten formát zná poměrně málo lidí a podle mě je méně intuitivní než třeba INI.
Podla mna lepsie pasuje k filozofii Pythonu ako JSON. Netreba {...}, ale treba odsadzovat tak ako v Pythone.
YAML bol navrhnuty ako ludsky-citatelny format. Je ale pravda ze JSON sa pouziva viac.
-
Shelve jsem nikdy nepoužil a nemám k tomu moc motivaci, pickle je pohodlné, pokud se používá jenom z Pythonu.
Shelve je jen syntax suggar na pickle.
Shelve som nepoznal, tak som ho teraz vyskusal, ale moc ma nenadchol.
Zatial co Pickle pri ulozeni vytvori iba jeden subor, Shelve mi vytvoril az tri subory:
*.dir, *.txt, *bak (t.j. kopia *.dir)
-
namiesto ZEO je uz dnes lepsie pouzit RelStorage backend (postgresql/mysql/oracle) ktorym zaroven vyriesite aj backup/restore
Jak to spolu souvisí? ZEO je server nad ZODB, který se stará o přístup z vícero procesů, cacheování a tak. RelStorage backend je jen způsob uložení dat. Nebo to chápu špatně?
-
namiesto ZEO je uz dnes lepsie pouzit RelStorage backend (postgresql/mysql/oracle) ktorym zaroven vyriesite aj backup/restore
Jak to spolu souvisí? ZEO je server nad ZODB, který se stará o přístup z vícero procesů, cacheování a tak. RelStorage backend je jen způsob uložení dat. Nebo to chápu špatně?
ano chapete to spatne ;-) RelStorage bol vytvoreny ako plna nahrada za ZEO - teda riesi aj pristup viacerych klientov/procesov k ZODB
-
Divní trolové,
tazatel se ptal v čem si má uchovat pár hodnot oběktu pro znovuspuštění, dokonce uvádí že si potřebuje uchovat tři proměné, a vy na něj jdete s databází ? Proboha proberte se a začněte přemýšlet než něco kváknete. Já jen doufám, že podobně neřešíte i vaše pracovní zadání. Já bych vás hnal, pokud by jste mi dotáhly kód kde místo využití základních knihoven na jednoduchý program/script budete mít půl A4 popsanou dependencies jen, že potřebujete uchovat pár bajtů kvuli znovu spuštění.
-
Divní trolové,
tazatel se ptal v čem si má uchovat pár hodnot oběktu pro znovuspuštění, dokonce uvádí že si potřebuje uchovat tři proměné, a vy na něj jdete s databází ? Proboha proberte se a začněte přemýšlet než něco kváknete. Já jen doufám, že podobně neřešíte i vaše pracovní zadání. Já bych vás hnal, pokud by jste mi dotáhly kód kde místo využití základních knihoven na jednoduchý program/script budete mít půl A4 popsanou dependencies jen, že potřebujete uchovat pár bajtů kvuli znovu spuštění.
Amen, promluvil E-mudrc, co musí srát do ostatních. Zrovna shelve (http://www.py.cz/Shelve) je součástí standardní distribuce a dělá přesně to, co OP chtěl - uchovává stav objektu a kód pro jeho použití je asi tak na pět řádků. OP nemusí řešit serializaci a deserializaci, narozdíl od případu použití JSON/YAML/INI.
To že se tu bavíme o ZODB, která je vhodná pro projekty většího typu* můžeš ignorovat, když se ti to nelíbí. Fakt nechápu, kde se bere ta potřeba si hned otevírat na všechny kanál.
*Doslova jsem psal: Případně pokud bys chtěl něco vhodného pro více threadů a komerční nasazení, tak http://www.zodb.org/
-
Použij csv, zapisuje se do něj fakt rychle, dívej
hodnoty = [1,2,3,4]
f = file("soubor.csv", "w")
delka = len(hodnoty)
for x in range(delka):
f.write(hodnoty[x] + "\n")
A je to
-
Myslim, ze je zbytocne dohadovat sa o tom, ktory modul je lepsi pre danu ulohu, ked OP nereaguje.
-
Tohle není soukromá poradna pro OPa, čte to podstatně víc lidí, kteří se z toho třeba i něco zajímavého dozví.
-
Když to OP už nečte, poradil bych mu eval.
uložení:
conf = {'x': 'foo'}
with open('config.dat', 'w') as f:
f.write(repr(conf))
načtení:
conf = eval(open('config.dat').read())
hahahahahahahaHAHAHAAAA!!
-
Tohle není soukromá poradna pro OPa, čte to podstatně víc lidí, kteří se z toho třeba i něco zajímavého dozví.
Nemohu plně souhlasit s myšlenkou,
tazatel něco neumí nebo něčemu nerozumí, vytvoří nové téma kde pokud někdo ví poradí. A tečka.
Sem tam se najde někdo kdo ho trolí, ale to už tak v naší společnosti je. No a pak se tam nabalí offtopic příspěvky. Ano to se stává, ale k tomu to primárně neslouží. Primární je zodpovědět a poradit co nejlepší cestu.
Databáze pro python by si zasloužily vlastní diskuzi, určitě ale nepatří jejich zmiňování do dotazu na uchování nastavení programu.
Tento příspěvek je také mimo mísu.
-
Použij csv, zapisuje se do něj fakt rychle, dívej
hodnoty = [1,2,3,4]
f = file("soubor.csv", "w")
delka = len(hodnoty)
for x in range(delka):
f.write(hodnoty[x] + "\n")
A je to
Bože to je prasárna...
Já osobně používám YAML, (pokud soubor beru řekněme jako config) líbí se mě to odsazování a snadná úprava.
Pokud do souboru chci jen ukládat, číst a nechci ho editovat tak YAML (i když taky snadno lze editovat...) případně pickle tam kde by mohlo svádět soubor ručně editovat, což si nepřeji...
-
Použij csv, zapisuje se do něj fakt rychle, dívej
hodnoty = [1,2,3,4]
f = file("soubor.csv", "w")
delka = len(hodnoty)
for x in range(delka):
f.write(hodnoty[x] + "\n")
A je to
Bože to je prasárna...
Já osobně používám YAML, (pokud soubor beru řekněme jako config) líbí se mě to odsazování a snadná úprava.
Pokud do souboru chci jen ukládat, číst a nechci ho editovat tak JSON (i když taky snadno lze editovat...) případně pickle tam kde by mohlo svádět soubor ručně editovat, což si nepřeji... U obou je výhoda že je nemusíš doinstalovávat.
Oprava...
-
Použij csv, zapisuje se do něj fakt rychle, dívej
hodnoty = [1,2,3,4]
f = file("soubor.csv", "w")
delka = len(hodnoty)
for x in range(delka):
f.write(hodnoty[x] + "\n")
A je to
Bože to je prasárna...
Co je na tom za prasárnu? Ve skole sem za to dostal jednicku a ten ucitel ma vysokou skolu, tak by mi ji asi nedal ne?
-
Nemohu plně souhlasit s myšlenkou,
tazatel něco neumí nebo něčemu nerozumí, vytvoří nové téma kde pokud někdo ví poradí. A tečka.
Sem tam se najde někdo kdo ho trolí, ale to už tak v naší společnosti je. No a pak se tam nabalí offtopic příspěvky. Ano to se stává, ale k tomu to primárně neslouží.
Jak, a tečka? Tohle fórum se jmenuje Vývoj, ne "OPova osobní poradna".
Primární je zodpovědět a poradit co nejlepší cestu.
Databáze pro python by si zasloužily vlastní diskuzi, určitě ale nepatří jejich zmiňování do dotazu na uchování nastavení programu.
Tento příspěvek je také mimo mísu.
S tím prostě nemůžu souhlasit - primární by mělo být se něco dozvědět a vést diskuze (alespoň přibližně) k tématu. Což (objektové!) databáze určitě jsou, to pozná i OP, až mu ten program začne přerůstat přes hlavu.
Já jsem se například dozvěděl, že se dá použít RelStorage, což je pro mě důležitá informace, kterou bych jinak těžko získával. To že se tady z toho různí začátečníci snaží udělat jejich osobní helpdesk neznamená, že my všichni ostatní se jim musíme podřizovat.
-
Použij csv, zapisuje se do něj fakt rychle, dívej
hodnoty = [1,2,3,4]
f = file("soubor.csv", "w")
delka = len(hodnoty)
for x in range(delka):
f.write(hodnoty[x] + "\n")
A je to
Bože to je prasárna...
Co je na tom za prasárnu? Ve skole sem za to dostal jednicku a ten ucitel ma vysokou skolu, tak by mi ji asi nedal ne?
Možná jsem jen nepoznal trolla, ale jestli se za toto dneska dávají jedničky, tak je to se školstvím mnohem horší, než se obecně soudí. Nebyl to příklad pro: udělejte na minimálním počtu řádků maximum programátorských chyb?
-
Divní trolové,
tazatel se ptal v čem si má uchovat pár hodnot oběktu pro znovuspuštění, dokonce uvádí že si potřebuje uchovat tři proměné, a vy na něj jdete s databází ? Proboha proberte se a začněte přemýšlet než něco kváknete. Já jen doufám, že podobně neřešíte i vaše pracovní zadání. Já bych vás hnal, pokud by jste mi dotáhly kód kde místo využití základních knihoven na jednoduchý program/script budete mít půl A4 popsanou dependencies jen, že potřebujete uchovat pár bajtů kvuli znovu spuštění.
Doufám že víte, jak přesně toto potom dopadá v praxi. V praxi se také chce udělat jednu věc rychle a jednoduše (místo blablabla použít blabla). Jenže tohle trvá asi tak týden, potom přijde požadavek, kde je potřeba udělat něco co sice jde ale drhne to, a potom přijde požadavek, který už znamená to kompletně přepsat (přitom kdyby se na počátku šlo na problém "z větší šíře", tak se další požadavky implementují jedna radost. Každý velký program začínal tím, že "je potřeba uchovat tři proměnné". Je naopak dobré tazateli poradit další možnosti, jak se s takovou situací vypořádat.
-
Použij csv, zapisuje se do něj fakt rychle, dívej
hodnoty = [1,2,3,4]
f = file("soubor.csv", "w")
delka = len(hodnoty)
for x in range(delka):
f.write(hodnoty[x] + "\n")
A je to
Bože to je prasárna...
Co je na tom za prasárnu? Ve skole sem za to dostal jednicku a ten ucitel ma vysokou skolu, tak by mi ji asi nedal ne?
Možná jsem jen nepoznal trolla, ale jestli se za toto dneska dávají jedničky, tak je to se školstvím mnohem horší, než se obecně soudí. Nebyl to příklad pro: udělejte na minimálním počtu řádků maximum programátorských chyb?
Ale tam zadna chyba neni! Dyt to funguje dobre.
-
Použij csv, zapisuje se do něj fakt rychle, dívej
hodnoty = [1,2,3,4]
f = file("soubor.csv", "w")
delka = len(hodnoty)
for x in range(delka):
f.write(hodnoty[x] + "\n")
A je to
Jo, jasně. A takhle nějak vy a ten váš učitel šifrujete, žejo?
text = "Tohle je tuze tajne"
klic = 3
delka = len(plaintext)
for i in range(delka):
plaintext[i] = plaintext[i] + klic
print text
-
Použij csv, zapisuje se do něj fakt rychle, dívej
hodnoty = [1,2,3,4]
f = file("soubor.csv", "w")
delka = len(hodnoty)
for x in range(delka):
f.write(hodnoty[x] + "\n")
A je to
Bože to je prasárna...
Co je na tom za prasárnu? Ve skole sem za to dostal jednicku a ten ucitel ma vysokou skolu, tak by mi ji asi nedal ne?
Možná jsem jen nepoznal trolla, ale jestli se za toto dneska dávají jedničky, tak je to se školstvím mnohem horší, než se obecně soudí. Nebyl to příklad pro: udělejte na minimálním počtu řádků maximum programátorských chyb?
Kdybys radsi chytraku hned v prvnim prispevku napsal jak je to neprasacky. Nebo jen tak blbe kecas?
-
Použij csv, zapisuje se do něj fakt rychle, dívej
hodnoty = [1,2,3,4]
f = file("soubor.csv", "w")
delka = len(hodnoty)
for x in range(delka):
f.write(hodnoty[x] + "\n")
A je to
Bože to je prasárna...
Co je na tom za prasárnu? Ve skole sem za to dostal jednicku a ten ucitel ma vysokou skolu, tak by mi ji asi nedal ne?
Možná jsem jen nepoznal trolla, ale jestli se za toto dneska dávají jedničky, tak je to se školstvím mnohem horší, než se obecně soudí. Nebyl to příklad pro: udělejte na minimálním počtu řádků maximum programátorských chyb?
Kdybys radsi chytraku hned v prvnim prispevku napsal jak je to neprasacky. Nebo jen tak blbe kecas?
Jen blbe keca, protoze na tom linuxu stejne programovat nejde. Neni pro nej visual studio.
-
Použij csv, zapisuje se do něj fakt rychle, dívej
hodnoty = [1,2,3,4]
f = file("soubor.csv", "w")
delka = len(hodnoty)
for x in range(delka):
f.write(hodnoty[x] + "\n")
A je to
Bože to je prasárna...
Co je na tom za prasárnu? Ve skole sem za to dostal jednicku a ten ucitel ma vysokou skolu, tak by mi ji asi nedal ne?
Možná jsem jen nepoznal trolla, ale jestli se za toto dneska dávají jedničky, tak je to se školstvím mnohem horší, než se obecně soudí. Nebyl to příklad pro: udělejte na minimálním počtu řádků maximum programátorských chyb?
Kdybys radsi chytraku hned v prvnim prispevku napsal jak je to neprasacky. Nebo jen tak blbe kecas?
hodnoty = [1,2,3,4]
delka = len(hodnoty)
for x in range(delka):
List je sám o sobě iterable, takže zjistit délku listu a potom vygenerovat další list (range) a ten naprat do smyčky je prasárna.
Prvek listu sice můžeme odkazovat indexem, ale když už máme smyčku, tak máme přímo hodnoty:
hodnoty = [1,2,3,4]
for h in hodnoty:
f.write(h + "\n")
Což je ale ten menší problém a začátečník na to časem přijde.
Dále se nikde nezavírá soubor f, lepší konstrukce je with open() as work_file: což automaticky uzavře a uvolní soubor i při výjimce.
Větší problém je chybné generování výsledného CSV. (Comma separated values) rfc4180
Co když budou hodnoty: ["a,b,c", "1,2", "x"]?
Program vygeneruje výstup, kde na každém řádku bude jiný počet hodnot (dejme tomu sloupců) - což není správné CSV. Vstup je třeba ošetřit.
Dále \n neodpovídá RFC, správně se řádek CSV ukončuje CRLF (\r\n).
Ještě by se dalo diskutovat o tom sčítání stringů apod.
Proto python obsahuje ve standardní knihovně modul pro práci s CSV.
-
nehlede na to ze spojuje int a str coz nejde...
v tak kratkem kodu nasekat tolik chyb je umeni :-)
-
nehlede na to ze spojuje int a str coz nejde...
Pravda.
v tak kratkem kodu nasekat tolik chyb je umeni :-)
jj, sem tam se najde chytrý troll :)
-
jen poznamka k iteraci pres list - nekdy je potreba i index, ruby na to ma cosi, a python taky :
http://stackoverflow.com/questions/522563/accessing-the-index-in-python-for-loops (http://stackoverflow.com/questions/522563/accessing-the-index-in-python-for-loops)
-
jj, sem tam se najde chytrý troll :)
Ale mentálně mě celkem uspokojuje, kolik času ste vrazili do toho mi všechno vyvrátit a ještě mě do puntíku opravit :)
-
...
Jo, jasně. A takhle nějak vy a ten váš učitel šifrujete, žejo?
text = "Tohle je tuze tajne"
klic = 3
delka = len(plaintext)
for i in range(delka):
plaintext[i] = plaintext[i] + klic
print text
RoFl. It is wrong on so many levels..
-
jj, sem tam se najde chytrý troll :)
Ale mentálně mě celkem uspokojuje, kolik času ste vrazili do toho mi všechno vyvrátit a ještě mě do puntíku opravit :)
neboj tolik času to nebylo, řekl bych asi tak stejně jako napsání toho tvého ukázkového kodu :-)