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 |
0 Коментари
Pokažite nam šta mislite o ovome!