[quote]O “imaginarnim problemima” reći ću samo da u tom prvom kodu praviš istu grešku jer će sad on raditi samo za slučajeve kada imaš tačno dvije tačke između prefixa i ekstenzije. Nikako da uvidiš problemsku logiku a to je da:
prefix ne sadrži tačke
naziv epizode može sadržavati bilo šta
ekstenzija je fiksna[/quote]
OK, napiši regex za:
srt datoteka ima N tačaka: A.B.C.D.E.F.srt
avi datoteka je nekada a) A.B.C.avi a nekada b) A.B.C.D.avi
I sa jednim i sa drugim pristupom posebno se trebaju obraditi a) i b);
Efektivno, ti se žališ da se moje rješenje za a) ne može iskoristiti za b). Ja nisam ni rekao da može bez prepravki, samo sam napravio korekciju da % radi matching sa desne strane (=> broj tačaka u srt je beznačajan, moramo se prilagoditi broju tačaka u avi datoteci)
Btw, vjerujem da postoji jedinstven regex koji rješava i a) i b); no ne želim to gledat na pun stomak.
Malo je forum nezgodan za ovakvih diskusija, više liči na igru gluhih telefona, sad kontam šta ti želiš reći, a nadam se i obrnuto.
P.S.
Borba do smrti Vedran <=> Adis sutra kode Reshe.
P.P.S.
ja volim ove tehničke “prepirke”, to ne znači da je posrijedi lični sukob (ili možda znači? posjetite! nas! na! redovnom! sastanku!, kod Reshe, četvrtkom u 20:00)
for f in os.listdir("."):
if f.endswith(’.avi’):
avi.append(f)
if f.endswith(’.srt’):
srt.append(f)
for a in avi:
for s in srt:
if s.startswith(a[:-4]):
os.rename(a, s[:-4] + ‘.avi’)
srt.remove(s)
continue[/code]
Napravimo liste avi i srt datoteka, za svaku avi datoteku probamo naći srt datoteku sa istim početkom, ako nađemo preimenujemo avi datoteku i izbacimo srt sa liste. Mada mislim da je python jednostavniji nego ovaj opis “svojim riječima”
Dir.glob(".avi").each { |iz|
u = Dir.glob("#{iz[0…-5]}.srt").first[0…-5] + ".avi"
File.rename(iz,u)
}[/code]
Edit: zamijenio [0] sa .first da bude citljivije
to se koristi kod funkcija koje primaju blok koda kao parametar -
one u ono izmedju || stavljaju neku vrijednost
(unutar takve jedne funkcije pozoves funkciju “yield neka_vrijednost” i onda se blok pokrece po jednom sa svakom vrijednoscu za koju je yield pozvan) …
Moguce je staviti i vise vrijednosti u jednom pokretanju bloka …
Dakle each stavlja u |iz| po jedan elemenat niza i pokrece predani blok za svaki od njih …
Mada mislim da je python jednostavniji nego ovaj opis “svojim riječima”
Mogao si koristiti os.walk(); poprilicno simplificira stvari. Npr:
[code]import os
def myrename(dir, suff_old, suff_new):
for root, dirs, files in os.walk(dir):
if not len(dirs):
break
for f in files:
if f.endswith(“.txt”):
new_file = f[:-4] + suff_new
os.rename(dir + “/” + f, dir + “/” + new_file)
Sanele gdje koristiš stuff_old u myrename()? Nisam imao vremena probati, ali mislim da ne radi?! Nije riječ o pukom mijenjanju ekstenzija datoteka.
“Glob” rješenja mi se ne sviđaju, jer se može desiti da dobijamo matcheve za već preimenovane avi datoteke.
(u mom primjeru to izbjegavamo sa onim zadnjim ‘continue’)
Evo “skinuto” par linija, imal ko ideju kako izbjeći ove dvije ugnijezđene for petlje?
[code]import os
list = os.listdir(".");
srt = [f for f in list if f.endswith(’.srt’)]
avi = [f for f in list if f.endswith(’.avi’)]
for a in avi:
for s in srt:
if s.startswith(a[:-4]):
os.rename(a, s[:-4] + ‘.avi’)
srt.remove(s)
continue[/code]
ovaj kod dole ti ne radi kako treba
Ah… .avi to .srt, .srt to .avi…
Sanele gdje koristiš stuff_old u myrename()? Nisam imao vremena probati, ali mislim da ne radi?! Nije riječ o pukom mijenjanju ekstenzija datoteka.
Pa gdje su te pythonske oci :P.
# if f.endswith(".txt"):
if f.endswith(suff_old):
“Glob” rješenja mi se ne sviđaju, jer se može desiti da dobijamo matcheve za već preimenovane avi datoteke
Ne vidim zasto bi se ovo desavalo. Pythonov glob ucita kompletan sadrzaj direktorija u listu, pa tek onda tu listu vrati tako da je ovaj slucaj prakticno nemoguc (iskljucujem slucaj da tokom reimenovanja neki eksterni izvor zapocne novo reimenovanje).
Evo “skinuto” par linija, imal ko ideju kako izbjeći ove dvije ugnijezđene for petlje?
Valjda tako sto ih ne pisati uopste :P. Za ovakve stvari bi se mogao dict iskoristiti zbog one-to-one mapiranja; svaki fajl sa .srt ekstenzijom treba imati svog .avi ekvivalenta.
hm … sta treba raditi u tom slucaju nije navedeno u originalnom zadatku …
a moj program nece preimenovati vec preimenovanu datoteku nego ce
preimenovati a.b.c.avi u onu prvu koju “glob a.b.c*.srt” bude matchao - dakle najverovatnije u a.b.c.1.avi . poslije toga vise nece dirati tu datoteku …
prvi onaj glob uzima stanje kakvo je bilo originalno i ucita ga u listu i kasnije iako ti mijenjas imena - stanje u listi ostaje isto …
U sustini tvoj program s listama i moj su isti po funkcionalnosti samo za sta ti koristis sekvencijalno pretrazivanje (unutrasnja petlja) ja koristim jos jedan glob.