Naloge
Nek računalnik hrani arhiv vseh sprememb datotek: vsakič, ko shranimo datoteko, zabeleži trenutni datum, ime datoteke in njeno dolžino. Podatki so lahko, recimo, takšni:
arhiv = [
"12/31/2018 ime_dat.avi 21532",
"10/16/2020 ime_dat.avi 314236",
"10/16/2020 some_other.avi 314236",
"1/1/1971 ime_dat.avi 312353",
"5/16/2020 ime_dat.avi 21532",
"10/18/2020 another_file.avi 351352",
"10/18/2018 another_file.avi 314236",
]
Vsaka vrstica opisuje spremembo datoteke:
- datum v obliki mesec/dan/leto,
- ime datoteke; le-to nikoli ne vsebuje presledkov,
- številka, ki predstavlja dolžino datoteke.
Med podatki so presledki. Vrstice niso urejene po datumu ali čemerkoli drugem.
Na disku, ki ga opisuje gornji seznam, so trenutno samo tri datoteke ("ime_dat.avi", "some_other.avi" in "another_file.avi"). Datoteka "ime_dat.avi" je bila shranjena štirikrat, in sicer 31. decembra 2018, 16. oktobra 2020, 1. januarja 1971, in 16. maja 2020. Na disku le zadnja različica, s 16. oktobra 2020.
Prve štiri funkcije, ki jih moraš napisati, prejmejo ime vrstice, kot je gornja. Te štiri funkcije se lahko seveda kličejo med sabo. Katera kliče katero, je stvar tvoje odločitve; nalogo je mogoče rešiti na različne načine.
datum(vrstica)
vrne datum kot terko (leto, mesec, dan). Klicdatum("5/15/1970 ime_dat.avi 42")
vrne(1970, 5, 15)
.Rešitev
def datum(vrstica): ime, datum, dolzina = vrstica.split() mes, dan, let = datum.split("/") return int(let), int(mes), int(dan)
ime(vrstica)
vrne ime datoteke. Klicime("5/15/1970 ime_dat.avi 42")
vrne niz"ime_dat.avi"
.Rešitev
def ime(vrstica): ime, datum, dolzina = vrstica.split() return ime
dolzina(vrstica)
vrne dolžino datoteke. Klicdolzina("5/15/1970 ime_dat.avi 42")
vrne42
.Rešitev
def dolzina(s): ime, datum, dolzina = vrstica.split() return int(dolzina)
podatki(vrstica)
vrne terko z gornjimi podatki. Klicpodatki("5/15/1970 ime_dat.avi 42")
vrne((1970, 5, 15), "ime_dat.avi", 42)
.Rešitev
def podatki(s): return datum(s), ime(s), dolzina(s)
Poleg teh štirih napiši še naslednje funkcije.
je_novejsa(s1, s2)
prejme dve vrstici in vrneTrue
, če imas1
novejši (kasnejši) datum kots2
, inFalse
, če ne. Klicje_novejsa("11/16/2020 ime.txt 316", "11/15/2015 foo.txt 314")
vrneTrue
.Rešitev
def je_novejsa(s1, s2): return datum(s1) > datum(s2)
najnovejsa(ime_datoteke, arhiv)
prejme ime datoteke in seznam, kot je na začetku naloge. Vrniti mora podatke o datoteki v času zadnje spremembe. Klicnajnovejsa("ime_dat.avi", arhiv)
(pri čemer jearhiv
takšen, kot je definiran zgoraj) vrne((2020, 10, 16), "ime_dat.avi", 314236)
, saj so to podatki o datoteki, kot je bila shranjena na zadnjega izmed štirih datumov, ko smo spreminjali to datoteko.Rešitev
def najnovejsa(ime, arhiv): naj_pod = None naj_dat = None for vrstica in arhiv: pod = dat, ime2, _2 = podatki(vrstica) if ime == ime2 and (naj_dat == None or dat > naj_dat): naj_pod = pod naj_dat = dat return naj_pod
datumi(ime_datoteke, arhiv)
vrne datume sprememb podane datoteke. Datumi morajo biti urejeni od kasnejših proti starejšim. Klicdatumi("ime_dat.avi", arhiv)
vrne[(2020, 10, 16), (2020, 5, 16), (2018, 12, 31), (1971, 1, 1)]
Rešitev
def datumi(ime, arhiv): dats = [] for vrstica in arhiv: dat, im, _ = podatki(vrstica) if im == ime: dats.append(dat) return sorted(dats, reverse=True)
brez(ime_datoteke, arhiv)
vrne seznam, ki je enak podanemu, le brez vrstica, ki se nanašajo na podano datoteko. Klicbrez("ime_dat.avi", arhiv)
vrne[ "10/16/2020 some_other.avi 314236", "10/18/2020 another_file.avi 351352", "10/18/2018 another_file.avi 314236", ]
Rešitev
def brez(im, arhiv): filtriran = [] for vrstica in arhiv: if ime(vrstica) != im: filtriran.append(vrstica) return filtriran