Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 629 odgovora
  • 108.312 pregleda

Najnovija ↓

Re: Zadaci za wannabe pythoniste 05.02.2020. u 16:58 · pre 82 meseca
izmenjeno 2 puta, poslednji put a1234567 06.02.2020. u 02:56
  1. a123456706.02.2020. u 02:56zapis iz teksta poruke
  2. a123456706.02.2020. u 02:55zapis iz teksta poruke
#241
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 :)
Re: Zadaci za wannabe pythoniste 06.02.2020. u 02:54 · pre 82 meseca #243
Pa šta smo mi windowsaši šugavi, pa je taj program samo za unix!?
E napravićemo još bolji i još stariji :D
Re: Zadaci za wannabe pythoniste 06.02.2020. u 03:00 · pre 82 meseca
izmenjeno 1 put, poslednji put a1234567 06.02.2020. u 05:21
  1. a123456706.02.2020. u 05:21zapis iz teksta poruke
#244
Rešenje zadatka broj 19
postavio sam ovde.
Re: Zadaci za wannabe pythoniste 06.02.2020. u 03:17 · pre 82 meseca #245
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
Re: Zadaci za wannabe pythoniste 06.02.2020. u 05:22 · pre 82 meseca #246
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.
Re: Zadaci za wannabe pythoniste 06.02.2020. u 12:28 · pre 81 mesec #247
"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.
Re: Zadaci za wannabe pythoniste 06.02.2020. u 12:45 · pre 81 mesec #248
"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?
Re: Zadaci za wannabe pythoniste 06.02.2020. u 13:04 · pre 81 mesec #249
Tvom programu treba 9 sekundi da se izvši dok se tail komanda izvršava za 0.002.
Re: Zadaci za wannabe pythoniste 06.02.2020. u 13:14 · pre 81 mesec #250
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.
Re: Zadaci za wannabe pythoniste 06.02.2020. u 13:23 · pre 81 mesec #251
"A jel ima neka komanda reverse, ko u listi [-1], pa pretumba redove i čita poslednje od početka?"

Ima reversed ili readlines()[::-1].
Re: Zadaci za wannabe pythoniste 06.02.2020. u 16:56 · pre 81 mesec #252
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.
Re: Zadaci za wannabe pythoniste 06.02.2020. u 17:46 · pre 81 mesec #253
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?

Re: Zadaci za wannabe pythoniste 06.02.2020. u 20:52 · pre 81 mesec #254
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
Re: Zadaci za wannabe pythoniste 07.02.2020. u 02:59 · pre 81 mesec #255
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')
Re: Zadaci za wannabe pythoniste 07.02.2020. u 06:25 · pre 81 mesec #256
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.
Re: Zadaci za wannabe pythoniste 07.02.2020. u 16:25 · pre 81 mesec #258
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 :)
Re: Zadaci za wannabe pythoniste 07.02.2020. u 16:35 · pre 81 mesec #259
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

Re: Zadaci za wannabe pythoniste 07.02.2020. u 22:02 · pre 81 mesec #260
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.
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme