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

Zadaci za wannabe pythoniste

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

Strane: << < .. 10 11 12 13 14 15 16 17 18 19 ... Dalje > >>

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

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Zadaci za wannabe pythoniste09.02.2020. u 16:33 - pre 51 meseci
Probaj da napišeš i izvršiš program
Code:
import sys
print( sys.argv )


sa desetak parametara, pa će ti sve biti jasno...

Code:
py argv.py 1 2 3 4 5 6 7 8 9 10
['argv.py', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste10.02.2020. u 13:51 - pre 51 meseci
Pa šta, jel fora da koliko god mu zadaš argumenata u komandnoj liniji, sys modul to upiše u argv?
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Zadaci za wannabe pythoniste10.02.2020. u 14:45 - pre 51 meseci
Naravno, zar si mislio da računar telepatijom pogađa koliko ti argumenata treba, pa ti onda toliko šalje, ili da šalje sve što si napisao u komandnoj liniji?

Naravno, na normalnim operativnim sistemima (Linux), shell radi ekspanziju naziva fajlova, dok glupavi Windows to ne ume da radi.
Na linuxu bi

py argv.py *.txt velikifajl.txt

Umesto *.txt stavio sve fajlove koji u direktorijumu iz kog si pozvao fajl imaju ekstenziju txt, dok Win šalje tačno ono što je napisano, pa onda ti traži fajlove koji odgovoraju imenu sa džoker znacima.
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste10.02.2020. u 15:09 - pre 51 meseci
Nisam mislio baš na telepatiju, ali jesam da mu možda u kodu definišeš broj argumenata, pa modul odatle to čita.
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste10.02.2020. u 16:46 - pre 51 meseci
Zadatak 21

Napravi program koji čita tekst iz fajla, dodaje redni broj ispred svakog reda
i tako numerisan tekst snima u novi fajl.
Naziv oba fajla će biti dat iz komandne linije.
Svaki red u novom fajlu počinje rednim brojem, dvotačkom i razmakom.

Samo toliko za ovaj put.
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste11.02.2020. u 08:30 - pre 51 meseci
Citat:
Na linuxu bi

py argv.py *.txt velikifajl.txt

Umesto *.txt stavio sve fajlove koji u direktorijumu iz kog si pozvao fajl imaju ekstenziju txt, dok Win šalje tačno ono što je napisano, pa onda ti traži fajlove koji odgovoraju imenu sa džoker znacima.

Ima Python glob modul kome može da se prosledi argument, na primer:
Code:
import glob
import sys

for files in glob.glob(sys.argv[1]):
    print(files)

Ili:

from pathlib import Path

p = Path('.')

for files in p.glob(sys.argv[1]):
    print(files)


https://docs.python.org/3/library/glob.html

https://docs.python.org/3/library/pathlib.html
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste13.02.2020. u 11:43 - pre 51 meseci
Evo i rešenja za zadatak 21
postavljenog ovde.

Ako neko ima neku drugačiju ideju, nek iskomentariše.
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste13.02.2020. u 13:55 - pre 51 meseci
Code (python):
import fileinput
import sys

with open(sys.argv[2], 'w') as fh:
    for line in fileinput.input(files=sys.argv[1]):
        fh.write(f'{fileinput.lineno()}: {line}')


Zadatak je sličan Linuksovoj nl komandi, ili više cat -n komandi koja takođe numeriše prazne linije. Obe komande imaju opcije da numerišu ili preskoče prazne linije, takođe mogu da procesuiraju više od jednog fajla. Na primer:

Code (bash):

# Komand `cat -n` slično tvom programu numeriše prazne linije
# što u nekim slučajevima i inije baš najbolje rešenje

cat -n 1.txt 2.txt
1 one
2 two
3 three
4 four
5    
6 five
7 six

# Za razliku od pomenute, komanda `nl` podrazumevano preskače prazne linije

nl 1.txt 2.txt
1 one
2 two
3 three
4 four
       
5 five
6 six


Probaj da implementiraš nešto slično u tvom programu.
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste13.02.2020. u 16:53 - pre 51 meseci
Pa evo ova petlja preskače prazne redove:

Code:
import sys

novi = open('novi.txt', 'w', encoding='utf-8')

broj = 1
with open('stari.txt', 'r') as f:
    for line in f:
        if len(line) == 1:
            novi.writelines(line)
        else:
            novi.writelines(str(broj) + '  ' + line)
            broj += 1

novi.close()

Ispis:
1 First Part.

2 By whom missioned falls the mind shot to its mark?
3 By whom yoked moved the first life-breath forward on its paths?
4 By whom impelled is this word that men speak?
5 What god set eye and ear to their workings?

6 That which is hearing of our
7 The wise are released beyond
8 There sight not, nor speech, nor the

 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste14.02.2020. u 05:08 - pre 51 meseci
Dobro, sad napiši da radi sa više fajlova, recimo da spojiš 4 u jedan fajl, slično kao gore pomenuta nl komanda, stim što tvoj program upisuje u fajl. Na primer:

tvoj_program.py file1.txt file2.txt file3.txt file4.txt file.txt
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste14.02.2020. u 08:24 - pre 51 meseci
tu je, spaja 4 fajla i numeriše svaki red, sem praznih:

Code:
if len(sys.argv) != 6:
    print("Unesi ime 4 ulazna i 1 izlaznog fajla u komandnoj liniji.")
    quit()

broj = 1
novi = open(sys.argv[5], "w")
try:
    for i in range(1, 4)
        with open(sys.argv[i], 'r') as f:
            for line in f:
                if len(line) == 1:
                    novi.writelines(line)
                else:
                    novi.writelines(str(broj) + '  ' + line)
                    broj += 1

except:
    print("Dogodila se greška pri učitavanju fajla.")
    quit()

Nego, kad mu dajem linijsku komandu

> python 152b-b.py new1.txt new2.txt new3.txt new4.txt novi.txt

kako da mu zadam i opcije, da recimo u jednoj varijanti numeriše sve redove (-ns), a u drugoj da preskoči prazne redobe (-nt)?
I kako onda da mu napravim help fajl da pokaže šta koja opcija znači (-h)?

> python 152b-b.py new1.txt new2.txt new3.txt new4.txt novi.txt -ns

> python 152b-b.py new1.txt new2.txt new3.txt new4.txt novi.txt -nt

> python 152b-b.py -h

 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste14.02.2020. u 09:05 - pre 51 meseci
Pogledaj getopt i argparse module.
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste14.02.2020. u 15:22 - pre 51 meseci
Hvala, pogledaću.

Nego, taman se ja izborio sam ovim tail programčićem, kad danas natrčim na ovo

Code:
from collections import deque

def tail(filename, n=10):
    with open(filename) as f:
        return deque(f, n)
    

print(tail('new2.txt'))


Da sam video ranije, nisam se morao mučiti
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste15.02.2020. u 14:30 - pre 51 meseci
Pogledao argparse i nije mi jasno kad jednom postavim argumente,
kako napravim skretnicu da jedan argument usmerava ka petlji koja numeriše sve redove,
a drugi kao petlji koja preskače prazne redove.

Trebalo bi u jednoj negde da udenem agparse.numesve,
a kod druge agparse.neprazne, ali ne znam kako :)


Code:
import sys
import argparse

parser = argparse.ArgumentParser(description='Numeriši redove u tekstu.')
parser.add_argument('--numsve', type=str, help='numeriši sve redove')
parser.add_argument("--neprazne", type=str, help='preskoči prazne redove')

args = parser.parse_args()


# Provera da su dati svi argumenti.
if len(sys.argv) != 4:
    print("Unesi naziv 2 ulazna i 1 izlaznog fajla u komandnoj liniji.")
    quit()

broj = 1
novi = open(sys.argv[3], 'w')

try:
    for i in range(1, 3):
        with open(sys.argv[i], 'r') as f:
            for i, line in enumerate(f, start=1):
                novi.writelines(('{}: {}'.format(i, line)))

except:
    print("Dogodila se greška pri učitavanju fajla.")
    quit()


try:
    for i in range(1, 3):
        with open(sys.argv[i], 'r') as f:
            for line in f:
                if len(line) == 1:
                    novi.writelines(line)
                else:
                    novi.writelines(str(broj) + '  ' + line)
                    broj += 1

except:
    print("Dogodila se greška pri učitavanju fajla.")
    quit()


 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste15.02.2020. u 20:18 - pre 51 meseci
Nisu ti potrebna dva argumenta, dovoljan je jedan. Ne znam šta te buni, jednostavno "if args.numsve: petlja 1 else: petlja 2" ili elif ako imaš više argumenata. Kako argument ne zahteva neku vrednost, zameni type=str sa action="store_true".
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste16.02.2020. u 05:07 - pre 51 meseci
Uradio, ali javlja grešku. Ne prepoznaje poslednja 2 argumenta.

C:\FAJLOVI\Python_School\> python 152b-c.py --numsve new1.txt new2.txt novi.txt
usage: 152b-c.py [-h] [--numsve NUMSVE]
152b-c.py: error: unrecognized arguments: new2.txt novi.txt


Code:
import sys
import argparse

parser = argparse.ArgumentParser(description='Numeriši redove u tekstu.')
parser.add_argument('--numsve', action='store_true', help='numeriši sve redove')

args = parser.parse_args()


# Provera da su dati svi argumenti.
if len(sys.argv) != 4:
    print("Unesi naziv 2 ulazna i 1 izlaznog fajla u komandnoj liniji.")
    quit()

broj = 1
novi = open(sys.argv[3], 'w')

if args.numsve:
    try:
        for i in range(1, 3):
            with open(sys.argv[i], 'r') as f:
                for i, line in enumerate(f, start=1):
                    novi.writelines(('{}: {}'.format(i, line)))

    except:
        print("Dogodila se greška pri učitavanju fajla.")
        quit()

else:
    try:
        for i in range(1, 3):
            with open(sys.argv[i], 'r') as f:
                for line in f:
                    if len(line) == 1:
                        novi.writelines(line)
                    else:
                        novi.writelines(str(broj) + '  ' + line)
                        broj += 1

    except:
        print("Dogodila se greška pri učitavanju fajla.")
        quit()
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste16.02.2020. u 08:23 - pre 51 meseci
Dodaj ih u parser, na primer:
Code:
parser.add_argument("files", nargs=argparse.REMAINDER)

ili

args, files = parser.parse_known_args()

print(args)
Namespace(files=['new1.txt', 'new2.txt', 'novi.txt'], numsve=True)

args.files[0]
'new1.txt'
args.files[1]
'new2.txt'
args.files[2]
'novi.txt'

len(args.files)
3


Zatim izmeni kod u nalik na sledeće:
Code (python):
# Provera da su dati svi argumenti.
if len(args.files) != 3:
    print("Unesi naziv 2 ulazna i 1 izlaznog fajla u komandnoj liniji.")
    quit()

broj = 1
novi = open(args.files[2], 'w')

if args.numsve:
    try:
        for i in range(len(args.files) - 1):
            with open(args.files[i], 'r') as f:
                for i, line in enumerate(f, start=1):
                    novi.writelines(('{}: {}'.format(i, line)))

    except:
        print("Dogodila se greška pri učitavanju fajla.")
        quit()

else:
    try:
        for i in range(len(args.files) - 1):
            with open(args.files[i], 'r') as f:
                for line in f:
                    if len(line) == 1:
                        novi.writelines(line)
                    else:
                        novi.writelines(str(broj) + '  ' + line)
                        broj += 1

    except:
        print("Dogodila se greška pri učitavanju fajla.")
        quit()


Inače, ova linija "for i, line in enumerate(f, start=1)" počinje ponovo od broja 1 prilikom narednog prolaska prethodne for petlje, pa imaš ponovo numerisanje od 1, 2, 3, itd.
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste16.02.2020. u 09:11 - pre 51 meseci
Evo malo jednostavnijeg rešenja bez duplih try i for:

Code (python):
import sys
import argparse
import fileinput

parser = argparse.ArgumentParser(description='Numeriši redove u tekstu.')
parser.add_argument('--numsve', action='store_true', help='numeriši sve redove')
parser.add_argument("files", nargs=argparse.REMAINDER)

args = parser.parse_args()

# Provera da su dati svi argumenti.
if len(args.files) != 3:
    print("Unesi naziv 2 ulazna i 1 izlaznog fajla u komandnoj liniji.")
    parser.print_help()
    sys.exit()

broj = 1
novi = open(args.files[2], 'w')

try:
    for line in fileinput.input(files=args.files[:2]):
        if args.numsve:
            if line.strip() == '':
                novi.write(line)
            else:
                novi.write(f'{broj}: {line}')
                broj+=1
        else:
            novi.write(f'{broj}: {line}')
            broj+=1
except FileNotFoundError as err:
    print(f'No such file: {err.filename}')
    parser.print_help()
finally:
    novi.close()

 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste17.02.2020. u 10:57 - pre 50 meseci
Da, ja sam samo kopirao obe petlje, a naravno da mogu obe da se stave u jednu.
Hvala Panto na lekciji!
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste17.02.2020. u 11:10 - pre 50 meseci
Sledi naravno zadatak broj 22

Napiši program koji nalazi najdužu reč/reči u tekstu. Prvo uklanja
svu interpunkciju, a na kraju ispisuje odgovarajuću poruku,
koja uključuje broj slova najduže reči, zajedno sa svim rečima
te dužine koje se nalaze u tekstu.

Ja sam svoje rešenje sačuvao ovde.
 
Odgovor na temu

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

Strane: << < .. 10 11 12 13 14 15 16 17 18 19 ... Dalje > >>

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

Postavi temu Odgovori

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