Esta é uma versão arquivada/estática do antigo Blog do André. Isso significa que todo o conteúdo aqui presente não irá ser atualizado, e pode conter erros. Algumas funcionalidades poderão não estar disponíveis nesta versão arquivada.
11
Jul 2008

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 :D )

#!/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!

Gostou deste artigo?

Facebook Twitter Google Plus Delicious

Comentários

Não existem comentários