Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Zadaci za wannabe pythoniste

[es] :: Python :: Zadaci za wannabe pythoniste

Strane: << < .. 8 9 10 11 12 13 14 15 16 17 ... Dalje > >>

[ Pregleda: 52566 | Odgovora: 629 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste05.02.2020. u 15:58 - pre 51 meseci
Evo stiže i zadatak broj 19.
Još malo pa jubilej!

E ovoga puta je stvar malo drugačija. Do sada sam kucao tekst u IDLE, pa F5 i program se izvrši. Sada menjamo taktiku.
Dakle, treba napisati program, sačuvati ga na disku, pa ga pokrenuti preko komandne linije.

Pri pokretanju programa dodajemo i jedan argument, a to je ime tekstualnog fajla.
Nešto ovako:

>>> python moj_program.py text.txt

Naš programčić treba da učita taj tekstualni fajl, proveri da li je dat argument. Ako nije, ispiše odgovarajuću poruku.
Ako jeste dat, onda ispiše poslednjih deset redova teksta iz učitanog fajla..

Kažu da u unix sistemima postoji isti ovakav program, koji se zove tail. Ajd da im verujemo :)



[Ovu poruku je menjao a1234567 dana 06.02.2020. u 02:55 GMT+1]

[Ovu poruku je menjao a1234567 dana 06.02.2020. u 02:56 GMT+1]
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Zadaci za wannabe pythoniste05.02.2020. u 16:23 - pre 51 meseci
Nije isti, moze mnogo vise.
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste06.02.2020. u 01:54 - pre 51 meseci
Pa šta smo mi windowsaši šugavi, pa je taj program samo za unix!?
E napravićemo još bolji i još stariji
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste06.02.2020. u 02:00 - pre 51 meseci
Rešenje zadatka broj 19
postavio sam ovde.

[Ovu poruku je menjao a1234567 dana 06.02.2020. u 05:21 GMT+1]
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Zadaci za wannabe pythoniste06.02.2020. u 02:17 - pre 51 meseci
Citat:
a1234567:
Pa šta smo mi windowsaši šugavi, pa je taj program samo za unix!?
E napravićemo još bolji i još stariji :D


tail koristim za pracenje log-ova, i da vidim zadnje linije izlaza neke komande.
recimo tail -f logfile ili : komanda | tail -n 10

znaci, u prvom slucaju -f opcija da se prati fajl kako raste a u drugom cita sa stdin-a
pa -n prikazuje zadnjih toliko linija izlaza.
Napravi tako na Win-u :P
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste06.02.2020. u 04:22 - pre 51 meseci
Napravio sam da se vidi poslednjih deset lniija.
Nisam još probao, ali pretpostavljam da mogu da ga prepravim da vidi poslednjih n linija, a da -n bude argument.
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste06.02.2020. u 11:28 - pre 51 meseci
"Napravio sam da se vidi poslednjih deset lniija."

Dobro je to ako imaš mali fajl, npr. par MB ili malo više, a ša ako recimo imaš fajl od par GB ili više. Na primer:
Code:
du -h log.txt 
1.6G    log.txt

# Komanda tail
$ time tail log.txt
tail log.txt  0.00s user 0.00s system 85% cpu 0.002 total

# Tvoj tail program
$ time ./tail.py
./tail.py  8.74s user 0.40s system 99% cpu 9.139 total


Problem je što tvoj kod prolazi kroz ceo fajl da bi prikazao poslednjih 10 linija, zar nije bolje da krene od poslednje linije u fajlu.

Da definišeš poziciju, pogledaj seek funkciju:
Citat:
seek(target, whence=0, /) method of _io.BufferedReader instance
Change stream position.

Change the stream position to the given byte offset. The offset is
interpreted relative to the position indicated by whence. Values
for whence are:

* 0 -- start of stream (the default); offset should be zero or positive
* 1 -- current stream position; offset may be negative
* 2 -- end of stream; offset is usually negative

Return the new absolute position.

Na primer:

Code:
# Krece od poslednje linije
position = fh.seek(0, 2)
# ....

$ time ./tail.py
./tail.py  0.02s user 0.00s system 97% cpu 0.025 total


Mnogo bolje zar ne? Sad ti samo ostaje da implementiraš ostatak koda.
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste06.02.2020. u 11:45 - pre 51 meseci
"97% cpu"
Ovo mi se najviše dopada. Al sam ga nagazio, do daske! :D
Pa nek radi. Bolje nego da se hvata na njega prašina :)

Dobro, veliki fajl. Ja sam krenuo sa txt fajlom od 50 redova, sitno,
a ti Panto bi odmah u veleprodaju. Lagano, dok se uhoda radnja.

Za seek znam. E to sam se patio dok nisam prokljuvio, zašto neće da čita fajl opet ispočetka, već došao do kraja i na print samo mi kaže "".
Ni makac!

Da bolje je otići na kraj fajla, pa krenuti odnazad.
A jel ima neka komanda reverse, ko u listi [-1], pa pretumba redove i čita poslednje od početka?
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste06.02.2020. u 12:04 - pre 51 meseci
Tvom programu treba 9 sekundi da se izvši dok se tail komanda izvršava za 0.002.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Zadaci za wannabe pythoniste06.02.2020. u 12:14 - pre 51 meseci
To 97% ne znači to što ti misliš.

To samo znači da je 97% realnog vremena (vremena između momenta od kada si lupio enter dok se nije komanda završila) procesor radio nad tvojim programom u poređenju sa vremenom koje je tvoj program stvarno potrošio.

Drugim rečima, računar nije radio ništa pametno, osim što je izvršavao python program.
Da je bilo nešto drugo da se radi, ne bi ti bio dodeljeno 97% procesorskog vremena. Idealno, želeo bi da dobiješ iznad 98% , ali to je malo teže na sistemu koji ima šta pametno da radi, a ne da vrti školske python programe.
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste06.02.2020. u 12:23 - pre 51 meseci
"A jel ima neka komanda reverse, ko u listi [-1], pa pretumba redove i čita poslednje od početka?"

Ima reversed ili readlines()[::-1].
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Zadaci za wannabe pythoniste06.02.2020. u 15:56 - pre 51 meseci
Inace ovo se najbrze radi tako sto se fajl mapira u memoriju pa se cita od pozadi. E sad ne verujem da je to izvodljivo u Pythonu osim preko C biblioteke, a verujem da to mora
da ima.
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste06.02.2020. u 16:46 - pre 51 meseci
Naišao sam na ovo zanimljivo rešenje

Code:
with open('logfile.txt', 'rb') as f:
    f.seek(-2, 2)
    while f.read(1) != b'\n':
        f.seek(-2, 1) 
    print(f.readline().decode())


Vrati ga do kraja fajla i onda ide redom unazad po dva bajta dok ne naiđe na kraj reda.
Ali tako otprinta samo poslednji red fajla.
E sad kako da to uradi recimo 5 puta.

Stavio ga u petlju, ali mi printa pet puta poslednju rečenicu :)

Kako ga ubediti da nastavi unazad od prvog kraja reda?

 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste06.02.2020. u 19:52 - pre 51 meseci
Zapamti poziciju pre f.readline(). readline() resetuje poziciju na kraj linije, pa petlja ponovo vrti istu liniju. Na primer:
Code (python):
with open('logfile.txt', 'rb') as f:
    f.seek(-2, 2)
    counter = 0
    while counter < 5:
        while f.read(1) != b'\n':
            f.seek(-2, 1)
        pos = f.tell()
        print(f.readline().decode())
        f.seek(pos - 2)
        counter += 1
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste07.02.2020. u 01:59 - pre 51 meseci
Tako sam i ja zamišljao da mu sa fajl.tell() zabeležim poziciju,
ali nisam znao kako da nastavim.

No, ovo tvoje rešenje štampa redove unazad, 5, 4, 3, 2, 1.

Ja sam još malo doradio i sad printa redovnim redosledom 1, 2, 3, 4, 5

Code:
redovi = []
with open('new1.txt', 'rb') as f:
    f.seek(-2, 2)
    counter = 0
    while counter < 5:
        while f.read(1) != b'\n':
            f.seek(-2, 1)
        pos = f.tell()
        redovi.append(f.readline().decode())
        f.seek(pos - 2)
        counter += 1
print(*redovi[::-1], sep='\n')
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste07.02.2020. u 05:25 - pre 51 meseci
Nije to moje rešeje već tvoje, samo sam ti napisao kao da pređe na novu liniju, da ne vrti uvek istu. Ima tu još nedostataka, šta ako recimo fajl ima samo 3 linije, tj. manje od onoga što je navedeno u counter. Linuksova tail komanda radi iako je podrazumevano 10.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Zadaci za wannabe pythoniste07.02.2020. u 11:19 - pre 51 meseci
Citat:
Branimir Maksimovic:
Nije isti, moze mnogo vise.


Kao što reče Branimir, radi mnoooogo više.
AKo te interesuje kako izgleda "pravi" program za tail, može lako da se nađe izvorni kod:
https://github.com/coreutils/coreutils/blob/master/src/tail.c

Nije naročito veliki program, samo 2537 linija C koda, mogu da se nauče lepe stvari...
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste07.02.2020. u 15:25 - pre 51 meseci
Citat:
Panta_:
Nije to moje rešeje već tvoje, samo sam ti napisao kao da pređe na novu liniju, da ne vrti uvek istu. Ima tu još nedostataka, šta ako recimo fajl ima samo 3 linije, tj. manje od onoga što je navedeno u counter. Linuksova tail komanda radi iako je podrazumevano 10.


Hm. Pa zato smo tražili ovo rešenje, jer su pretpostavljeni fajlovi mnooogo veći od 3 reda.
Mada, ok, mogao bi prvo program da prebroji redove u fajlu i onda limitira broj traženih redova za izlistavanje.

Ali onda smo opet na početku. Kako prebrojati redove, a da program ne prođe kroz ceo fajl?
Što smo hteli da izbegnemo :)
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste07.02.2020. u 15:35 - pre 51 meseci
Citat:
djoka_l:

Kao što reče Branimir, radi mnoooogo više.
AKo te interesuje kako izgleda "pravi" program za tail, može lako da se nađe izvorni kod:
https://github.com/coreutils/coreutils/blob/master/src/tail.c

Nije naročito veliki program, samo 2537 linija C koda, mogu da se nauče lepe stvari...


Pogledao, lepo izgleda, samo što ne razumem mnogo.
No, blizu sam. Još svega 2530 redova :))

Nego, kod ovog pozivanja programa preko komandne linije,
kako dajem mogućnost za dodatne parametre?
Recimo, ako hoću da zadam broj linija koje treba da izlista.

> python tail.py new1.txt 5

 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste07.02.2020. u 21:02 - pre 51 meseci
Citat:
Hm. Pa zato smo tražili ovo rešenje, jer su pretpostavljeni fajlovi mnooogo veći od 3 reda.
Mada, ok, mogao bi prvo program da prebroji redove u fajlu i onda limitira broj traženih redova za izlistavanje.

A možeš samo da proveriš poziciju, tj. ako je f.tell() == 0 (početak fajla), onda prekineš dalje izvršavanje (break) i ispišeš linije.
 
Odgovor na temu

[es] :: Python :: Zadaci za wannabe pythoniste

Strane: << < .. 8 9 10 11 12 13 14 15 16 17 ... Dalje > >>

[ Pregleda: 52566 | Odgovora: 629 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.