Četvrta verzija programa

13.5 Četvrta verzija programa

Problem: Jedan moj korisnik ima problem. Pogledaj šta mu se desi kada odjedanput pokuša da ubaci više fajlova u naš program:
./beckap_v3.py 
Unesi imena fajlova koje želiš da bekapuješ 
Unesi reč "kraj" za kraj unosa. 
Veran Bekaper v3.0 >>> '/home/lenj/Desktop/Novi rad/Test Kodovi' '/home/lenj/Desktop/Novi rad/Primeri Python kodova.odt' '/home/lenj/Desktop/Novi rad/Problemator.odt' '/home/lenj/Desktop/Novi rad/Problemator.pdf' '/home/lenj/Desktop/Novi rad/Skripta za Python.odt' 
Unesi reč "kraj" za kraj unosa. 
Veran Bekaper v3.0 >>> kraj 
OPREZ! 
Putanja 
/home/lenj/Desktop/Novi rad/Test Kodovi' '/home/lenj/Desktop/Novi rad/Primeri Python kodova.odt' '/home/lenj/Desktop/Novi rad/Problemator.odt' '/home/lenj/Desktop/Novi rad/Problemator.pdf' '/home/lenj/Desktop/Novi rad/Skripta za Python.odt 
NE POSTOJI! 
Želite li da unesete novu putanju, pritisni Samo Enter za ne? 
 
Veran Bekaper v3.0 >>> 
Naša skripta ne prepoznaje da je korisnik ubacio više foldera ili fajlova u jednu liniju. Kako ovo da fiksiramo?
Odgovor: Pa ovo je sada laganica od problema! Prvo sačuvajmo našu skriptu kao beckap_v4.py, pa krećemo sa eksperimentom.
U suštini, mi bi smo mogli samo da promenimo funkciju koja pita korisnika za unos, jer je ona na neki način prva na udaru korisnika, ali ti ne znaš da ja ovu funkciju koristim i za potrebe nekog drugog programa... Bio bi problem da je izmenim, pa da menjam sve programe u kojima je koristim... Šta mogu da uradim?
Pa – mogu da joj zadam parametar sa podrazumevanom vrednošću, koji će menjati njeno ponašanje u zavisnosti od potrebe, a u ovom programu prilikom njenog poziva da koristim argument koji će joj reći – sada radi ovako!
Kada sam se odlučio za ovakvo rešenje problema, vreme je za dizajn.... Gledajući obaveštenje koje mi je skripta izbacila shvatam da je program umesto liste fajlova dobio jedan veliki string, u kojima je razmak između objekata predstavljen kao /' '/ (prazan znak između apostrofa). Bilo bi dobro da samo u ovom programu koristim split() metodu stringova kako bih dobio listu iz ovog jednog korisničkog unosa. Samo, sada imam problem – ako budem koristio metodu append() dobiću listu unutar liste – ali, umesto nje – tu je extend()!
Na kraju će naš program izgledati ovako – prikazan je ceo:
#!/usr/bin/env python3 

'''Skripta koja radi bekap fajlova.''' 

import time 
import os, zipfile 

__version__ = '4.0' 

def pita(pitanje, kraj = None, razmak = None): 
    '''Pita korisnika pitanja, ukoliko nije naznačena reč za kraj 
    pita samo jedno pitanje, vraća listu odgovora.''' 
    odgovori = [] 
    prompt = 'Veran Bekaper v4.0 >>> ' 
    if not kraj: 
        print(pitanje) 
        odgovor = input(prompt).split(razmak) 
        odgovori.extend(odgovor) 
    else: 
        print(pitanje) 
        while True: 
            print('Unesi reč "{}" za kraj unosa.'.format(kraj)) 
            odgovor = input(prompt).split(razmak) 
            if kraj in odgovor: 
                break 
            odgovori.extend(odgovor) 
    return odgovori 

def provera(putanja): 
    '''Proverava svaku prosleđenu putanju. 
    Vraća nam listu stringova, u kojoj je svaki string ispravna putanja.''' 
    povratna = [] 
    nesme = (' ', '"', "'") 
    for i in putanja: 
        while i: 
            prvo = i[0] 
            zadnje = i[-1] 
            if prvo in nesme: 
                i = i[1:] 
                continue 
            elif zadnje in nesme: 
                i = i[:-1] 
                continue 
            elif  not os.path.exists(i): 
                upozorenje = 'OPREZ!\nPutanja\n{}\nNE POSTOJI!\nŽelite li da unesete novu putanju, pritisni Samo Enter za ne? \n '.format(i) 
                pomocna = pita(upozorenje) 
                if len(pomocna) != 0: 
                    pomocna = provera(pomocna) 
                    povratna.extend(pomocna) 
                break 
            else: 
                povratna.append(i) 
                break 
    return povratna 
                
            


def ime_arh(destinacija): 
    '''Kreira direktorijum, koji će se nalaziti u destinaciji a nosi ime koje je 
    trenutni datum. Vraća string koji predstavlja naziv arhive.''' 
    komentar = input('Komentar arhive --> ') 
    if len(komentar) == 0: 
        arh = 'regular' 
    else: 
        arh = 'koment' 
    datum = time.strftime('%d-%m-%Y') 
    vreme = time.strftime('%H%M%S') 
    direktorijum = '{}{}{}-Bekap-{}'.format(destinacija, os.sep, arh, datum) 
    if not os.path.exists(direktorijum): 
        os.mkdir(direktorijum) 
        print('Kreirao sam novi direktorijum -->', direktorijum) 
    arhiva = '{0}{1}{2}{3}.zip'.format(direktorijum, os.sep, vreme, komentar) 
    return arhiva 
            

def bekap(izvor, destinacija): 
    '''Vrši bekap fajlova koji se nalaze u listi izvor u destinaciju.''' 
    arhiva = zipfile.ZipFile(destinacija, mode = 'w', allowZip64 = True) 
    for fajl in izvor: 
        if os.path.isfile(fajl): 
            arhiva.write(fajl, arcname = os.path.abspath(fajl), compress_type = zipfile.ZIP_DEFLATED) 
        elif os.path.isdir(fajl): 
            # Idemo sa os.walk u svaki fajl direktorijuma 
            for direktorijum , subdirektorijum, mete in os.walk(fajl): 
                for deo in mete: 
                    svaki_fajl = (os.path.join(direktorijum, deo)) 
                    arhiva.write(svaki_fajl, arcname = os.path.abspath(svaki_fajl), compress_type = zipfile.ZIP_DEFLATED) 
        else: 
            print('Ne mogu da nađem -->', fajl) 
    arhiva.close() 

def glavni(): 
    '''Glavni deo programa.''' 
    izvor = [] 
    while not izvor: 
        izvor = pita('Unesi imena fajlova koje želiš da bekapuješ', 'kraj', razmak = "\' \'") 
        if izvor: 
            izvor = provera(izvor) 
    destinacija = [] 
    while not destinacija: 
        destinacija = pita('Gde želiš da sačuvaš arhivu?', razmak = '\' \'' ) 
        if  destinacija: 
            destinacija = provera(destinacija) 
    # vraćena nam je lista treba nam string 
    destinacija = destinacija[0] 
    ime = ime_arh(destinacija) 
    print('Radim....') 
    bekap(izvor, ime) 
    input('Kraj! Pritisni Enter za izlaz!') 


if __name__ == '__main__': 
    glavni()
Program je pretrpeo neznatne izmene a radi kao zmaj!
./beckap_v4.py 
Unesi imena fajlova koje želiš da bekapuješ 
Unesi reč "kraj" za kraj unosa. 
Veran Bekaper v4.0 >>> '/home/lenj/Desktop/Novi rad/Test Kodovi' '/home/lenj/Desktop/Novi rad/Primeri Python kodova.odt' '/home/lenj/Desktop/Novi rad/Problemator.odt' '/home/lenj/Desktop/Novi rad/Problemator.pdf' '/home/lenj/Desktop/Novi rad/Skripta za Python.odt' 
Unesi reč "kraj" za kraj unosa. 
Veran Bekaper v4.0 >>> kraj 
Gde želiš da sačuvaš arhivu? 
Veran Bekaper v4.0 >>> 
Gde želiš da sačuvaš arhivu? 
Veran Bekaper v4.0 >>> /home/lenj/Desktop/ 
Komentar arhive --> jupi 
Kreirao sam novi direktorijum --> /home/lenj/Desktop//koment-Bekap-31-10-2013 
Radim.... 
Kraj! Pritisni Enter za izlaz! 
Još jedna muka manje.....

13.4 Treća verzija
programa
Indeks 13.6 Dalja unapređenja
programa

Коментари

Popularno

Audacious - program za slušanje muzike

LibreOffice Calc - program za izradu tabela

Brasero - program za rezanje CD-ova

Bekstvo iz Titela

Minitube - program za praćenje YouTube sadržaja

Idemo

Bezimena

Pozadina Bekstva iz titela

Pažljivo sa MS Word dokumentima koje primate putem elektronske pošte

Šta je to "prosijački štap" i kako se do njega dolazi? (prvi deo)