O meu primeiro programa em Python!
Parece que não me arrependi de aprender Python. Hoje, tiver o prazer de acabar o meu primeiro programa “a sério”. A sério, porque foi o primeiro programa que me servirá para me automatizar algumas tarefas.
Neste caso, criei um pequeno programa que me vasculha uma pasta e suas sub pastas, para criar nomes únicos às imagens dentro de uma pasta. Isto porque algumas imagens de galerias têm nomes como 01.jpg, 02.jpg, etc. Ora, basta ir a outra galeria de outro tema, e lá me aparece o diálogo “tem a certeza que quer substituir…”. Assim, quando terminar o download das minhas imagens, corro o programa, e nunca mais (teoricamente) vou ter colisões de nomes de ficheiros.
Deixo aqui o código que desenvolvi, comentando as linhas mais importantes, para que alguém com dúvidas semelhantes não demore 2 dias a fazer isto (sim, foi o que eu demorei, ainda estou muito verdinho em Python )
#!/usr/include/python2.4
import os, re, md5
def processaPasta(pasta):
# esta função é recursiva
# por cada ficheiro nesta pasta...
for ficheiro in os.listdir(pasta):
if os.path.isdir(pasta + "/" + ficheiro):
processaPasta(pasta + "/" + ficheiro)
else:
mudaNome(pasta, ficheiro)
def mudaNome(pastaActual, nomeFicheiro):
# ver as expressões regulares em baixo
if imagens.match(nomeFicheiro) and not(jaVerif.match(nomeFicheiro)):
# abre-se o ficheiro
f = open(pastaActual + "/" + nomeFicheiro)
# obtem-se a extensão para adicionar ao fim do novo nome
nomeSeparado = os.path.splitext(nomeFicheiro)
# com a fução MD5, calcula-se a hash do ficheiro, e o novo nome será essa hash
novoNome = md5.new(f.read()).hexdigest() + nomeSeparado[len(nomeSeparado) - 1]
f.close()
os.rename(pastaActual + "/" + nomeFicheiro, pastaActual + "/" + novoNome)
# expressões regulares para verificar tem extensão de imagem
# ver se o ficheiro não sofreu uma alteração de nome antes (no caso, não será preciso mudar outra vez)
imagens = re.compile("^(.)+.(jpg|jpeg|gif|png)$")
jaVerif = re.compile("^([a-f0-9]){32}.(jpg|jpeg|gif|png)$")
pastaBase = "/home/Andre/Imagens"
processaPasta(pastaBase)
print "Done :)"
Testado em Linux (Ubuntu) e funciona, no Windows não cheguei a testar, mas a lógica está explicita, penso eu de que; o algoritmo é composto por uma função recursiva que obtém os ficheiros de cada pasta, e por outra função, que muda o nome aos ficheiros. Se alguém quiser corrigir ou apresentar uma sugestão melhor, pode fazê-lo, até agradeço Até mais!
Comentários