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.164 pregleda

Najnovija ↓

Re: Zadaci za wannabe pythoniste 09.02.2020. u 17:33 · pre 81 mesec #281
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']
Re: Zadaci za wannabe pythoniste 10.02.2020. u 14:51 · pre 81 mesec #282
Pa šta, jel fora da koliko god mu zadaš argumenata u komandnoj liniji, sys modul to upiše u argv?
Re: Zadaci za wannabe pythoniste 10.02.2020. u 15:45 · pre 81 mesec #283
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.
Re: Zadaci za wannabe pythoniste 10.02.2020. u 16:09 · pre 81 mesec #284
Nisam mislio baš na telepatiju, ali jesam da mu možda u kodu definišeš broj argumenata, pa modul odatle to čita.
Re: Zadaci za wannabe pythoniste 10.02.2020. u 17:46 · pre 81 mesec #285
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.
Re: Zadaci za wannabe pythoniste 11.02.2020. u 09:30 · pre 81 mesec #286
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
Re: Zadaci za wannabe pythoniste 13.02.2020. u 14:55 · pre 81 mesec #288
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.
Re: Zadaci za wannabe pythoniste 13.02.2020. u 17:53 · pre 81 mesec #289
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

Re: Zadaci za wannabe pythoniste 14.02.2020. u 06:08 · pre 81 mesec #290
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
Re: Zadaci za wannabe pythoniste 14.02.2020. u 09:24 · pre 81 mesec #291
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

Re: Zadaci za wannabe pythoniste 14.02.2020. u 16:22 · pre 81 mesec #293
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 :D
Re: Zadaci za wannabe pythoniste 15.02.2020. u 15:30 · pre 81 mesec #294
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()


Re: Zadaci za wannabe pythoniste 15.02.2020. u 21:18 · pre 81 mesec #295
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".
Re: Zadaci za wannabe pythoniste 16.02.2020. u 06:07 · pre 81 mesec #296
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()
Re: Zadaci za wannabe pythoniste 16.02.2020. u 09:23 · pre 81 mesec #297
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.
Re: Zadaci za wannabe pythoniste 16.02.2020. u 10:11 · pre 81 mesec #298
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()

Re: Zadaci za wannabe pythoniste 17.02.2020. u 11:57 · pre 81 mesec #299
Da, ja sam samo kopirao obe petlje, a naravno da mogu obe da se stave u jednu.
Hvala Panto na lekciji!
Re: Zadaci za wannabe pythoniste 17.02.2020. u 12:10 · pre 81 mesec #300
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.
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme