laikmatis pythone

S
  • 8 Bal '10

sveiki,

man reiketu susikurti laikmati pythone, kuris skaiciuotu sekundes ir minutes. to kurimo viena is principu zinau, t.y. rasyti cikla ir kiekvienos iteracijos metu didinti indeksa vienetu ir tokiu budu lyg ir turetu buti nustatomos sekundes. taciau as sugalvojau galbut tikslesni buda, taciau reik ismananciu patarimo.

Nutariau laikmati realizuoti pagal sistemini laika. na tarkim programos vykdymo pradzioj paemu sistemos laika kuris yra pvz 09:54:25. Programos pabaigoje vel nuskaitau laika, kuris tarkim 09:55:25. bet cia iskyla problema kaip gauti siu laiku skirtuma, nes rezultate noreciau tureti toki daikta 00:01:00, kas reikstu kad vykdant programa praejo viena minute. gal kas turetumete minciu ar pavyzdziu kaip tai teisingai logiskai atlikti? aciu

S
  • 8 Bal '10
import time
from datetime import datetime
t1 = datetime.now()
time.sleep(5)
t2 = datetime.now()
delta = t2 - t1
print(delta.seconds)
S
  • 8 Bal '10

ismeginau, lyg ir veikia. tik idomus niuansas tas, kad padarius time.sleep(5) rezultatas buna 4 sekundes, time.sleep(6) - 5 sekundes ir t.t. zodziu visad rodo maziau viena sekunde. bet lyg ir atkasiau del ko taip. nes praejus 6 sekundem pagal sisteminiu laiku skirtuma rodo 0:00:05:999546 turbut dar reik pazaist su laiko formatais kad bent jau nerodytu tiek sekundziu daliu, o butu tik 0:00:05:99 pvz.

bet viskas lyg ir veikia tai aciu sirex. gan geras dalykelis cia manau, galima pateikt tik sekundem, galima visa formata paziuret..

S
  • 8 Bal '10

Bet kokiu atveju sisteminis laikrodis tikrai yra tikslesnis už time.sleep()

S
  • 8 Bal '10

dar norejau pasiklausti koks turi buti duomenu tipas duombazej, kad iseitu issaugoti tarkim tokia parametro delta reiksme, gauta atemus du laikus: 00:00:08.262975? nes jei tipas buna varchar saugo mazdaug taip: 0 0:0:8.. visiska pieva atrodo. jei formata pakeiciu i time saugo biski normaliau 00:00:08.. bet kaip imesti ir sekundes dalis?

S
  • 8 Bal '10

varchar tai turėtų išsaugoti normaliai, bet tokius duomenis saugoti varchar tipu nėra labai protinga.

Kokią duomenų bazę naudoji? Kiek žinau standartiškai duomenų bazės neturi tokių tipų, kur būtų saugomos ir sekundės dalys, tai šiuo atveju manau geriausią laiką versti į skaičių ir saugoti į INT UNSIGNED tipą, nurodant reikiamą skaičiaus dydį, kad tilptų visa laiko informacija.

S
  • 8 Bal '10

naudoju mysql. keista kad varchar neteisingai saugoja, bet nieko padaryt neiseina kad su tuo tipu saugotu gerai. laiko vertimas i skaiciu atliekamas sitaip:

skaicius = int(kintamasis)

ar teisingai darau? bet atliekant toki konvertavima ir saugant duombazej int tipu vis tiek nera gerai, tai svarstau gal vertes pasitenkint laiku be sekundes daliu. tik keista, nes rasant i faila jokiu problemu, atrodo i duombaze turetu tikrai viska iseit surasyt, bet universalusis varchar kazkodel viska iskraipo.

N
  • 8 Bal '10

o tu bent zinai kuom int skiriasi nuo float? nes 8.5... yra float o ne int (-;

S
  • 8 Bal '10

@Neodan rašė:
o tu bent zinai kuom int skiriasi nuo float? nes 8.5... yra float o ne int (-;

8 yra int, 8.5 yra float.. ne tame esme.. 00:00:08 nei tas nei tas siaip..

S
  • 8 Bal '10

Siūlyčiau saugoti MySQL FLOAT tipu, delta reikšmę verčiant į sekundes taip:

>>> import timelib

>>> from datetime import datetime

>>> a = datetime.now()

>>> b = timelib.strtodatetime('5 minutes ago')

>>> d = a - b

>>> d
    datetime.timedelta(0, 11080, 522668)

>>> d.seconds + d.microseconds * 10**-6
    11080.522668

Į duomenų bazę reikėtų saugoti: 11080.522668

Išsaugosi tikslų laiko skirtumą, neprarandant mikrosekundžių.

S
  • 10 Bal '10

dar turiu viena klausima, susijusi su duombaze. kokiu budu i duombaze irasyti failo dydi kartu su vienetais? tarkim pasiemu savo failo dydi tokia eilute

size = os.path.getsize(sourcefile)

kintamajame size gaunu failo dydi baitais. tarkim 62145. taciau man idomu kaip butu galima irasyti i duombaze ne tik ta skaiciu bet kad butu kartu su vienetais pvz ne 62145, o 62145 bytes. ir koks turetu but duomenu tipas mysql'e?

S
  • 10 Bal '10

O kam tau saugoti prie skaičiaus 'bytes'? Koks tikslas?

S
  • 10 Bal '10

na tarkim duombazej yra stulpelis file size. jame yra sitie skaiciukai baitais. bet galbut kitam vartotojui prisijungus prie db nebus aisku kuom tas failo dydis matuojamas. nebent stulpelio virsuje nurodyt tuos vienetus. panasiai ir su kitu stulpeliu, kuriame yra apytiksliai paskaiciuojamas failo perdavimo laikas baitais per sekunde. taciau matant vien skaiciu 7357 neaisku ar ten bitai per sekunde, ar baitai, o gal Kb..

S
  • 10 Bal '10

Duomenų bazėje niekada nesaugomi jokie paaiškinimai, ten saugomi tik skaičiai. Ne gana to, didelėse duomenų bazėse, svarbus kiekvienas stulpelio bitas, todėl tavo noras prie skaičiaus saugoti dar ir komentarą, ką jis reiškia, prasilenkia su logika.

Žinoma, priklauso kokiu tikslu duomenų bazė naudojama.

Šiaip tai komentarą galima įrašyti kuriant lentelę:

CREATE TABLE `test` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `filesize` INT COMMENT 'File size in bytes',
    PRIMARY KEY (`id`)
);
S
  • 10 Bal '10

visiskai pritariu del to, kad duombazej nereikalinga jokia pertekline informacija. sprendimas irasyti komentara yra geras ir turbut juo pasinaudosiu, tik klausimas kada ta komentara rodo db vartotojui?

Taip pat idomu ar galima per python gauti failo dydi ne baitais, o bitais? arba kilobitais ir pan..

S
  • 10 Bal '10

MySQL laukų komentarus rodo šios komandos:

SHOW CREATE TABLE 
SHOW FULL COLUMNS FROM

Dėl failo dydžio kitais vienetais, tai galima naudoti tokią paprastą funkciją:

def human_readable_size(size):
    for x in ['bytes','KB','MB','GB','TB']:
        if size < 1024.0:
            return "%3.1f%s" % (size, x)
        size /= 1024.0

Jei vietoj baitų, nori gauti bitus, tai baitus daugini iš aštuonių.

S
  • 10 Bal '10

aciu, sirex, naudingi patarimai. tik jei naudosiu failu dydzius skirtingais vienetais, pvz bytes, KB, MB ir pan tai juos saugant duomenu bazej jau tikrai reikia nurodyti salia skaiciaus ir vienetus.

S
  • 10 Bal '10

Tikrai neįsivaizduoju, ką nori daryti su savo duomenų baze. Bet praktikoje dažniausiai saugomas bendrinis skaičius, o konvertavimas į visokius „human readable“ formatus daromas išvedimo metu.

Kadangi kaip suprantu, bandai padaryti tiesiogiai prieinamą duomenų bazę, tai galima naudoti stored routines arba views, kur iš bendrinius duomenis saugančios lentelės galėsi pateikti „human readable“ rezultatus.

S
  • 12 Bal '10

prie to pacio noretusi paklausti dar vieno klausimo. nezinau tiksliai ar tai su python ar su linux susijes klausimas, taciau nusimanantys ir apie ta, ir apie ta galbut gales uzvesti ant teisingo kelio.

as linuxe dirbu su bluetooth adapteriu ir pythonu programuoju ji. paciam failu perdavimui naudoju bibliotekas lightblue arba bluez.. turbut aisku kad perduodant faila per bluetooth pvz i mobilu telefona jame issoka pranesimas ar nori keistis duomenimis ir vartotojas turi patvirtinti arba atmesti. ir sitoj vietoj iskyla problemele.

yra taip kad jei vartotojas neatsako 30 sekundziu t.y. nei patvirtina nei atmeta siuntima, biblioteka grazina errora, kuriame raso kad vartotojas nepasiekiamas.. man 30 sekundziu timeout yra per didelis, todel norejau pasiklausti idejos: ar timeout bluetooth irenginiams nusistato paciam linuxe, ar toks parametras turi buti nustatinejamas kazkur biblioteku aprasuose? nes itariu jei dabar default timeout yra padarytas 30 sekundziu, tai galeciau ji pasidaryti sau kad ir 5 sekundes. pati biblioteka pythone tokio daikto kaip set.timeout(5) nesupranta, todel manau reik lyst giliau.

S
  • 12 Bal '10

Jei pateiktum pilną, veikiantį kodo gabalą, tai pasižiūrėčiau kaip ir kas veikia. Asmeniškai man neteko naudotis bluez.