Hola, quiero compartir un script que hice hace algún tiempo la verdad, se puede mejorar, reprogramar y documentar mejor claro está, lo hice para trabajar con conjuntos de archivos a mi medida, me refiero a cantidades de mas de 3000 archivos en los que me tenía que manejar.
Aviso: Desde entonces he mejorado en varios aspectos, tanto en inglés como en programación, así que perdónenme por la mala sintaxis y como dice ahí con mi inglés de la época, era para uso personal, pero lo tengo tirado sin uso.
Para quien quiera mejorarlo, reprogramarlo...etc, que me deje en los créditos :xD, ojala le sirva a alguien tanto como para aprender como para alguna otra cosa. Saludos y gracias.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#file renamer 1.0
#file renamer is script for rename files easy, this vactions proyect continuous
#its development, so that it can be some strange, above all it is written in
#spanish and for english speaking can be difficult of understand, this is
#beacause the vacation proyect was thought for creator's private use.
#modulos
import os
from sys import exit
from time import sleep
#bugs conocidos:
#despues de usar r -s si se usa r -s -i f - palabra da error como si los
#tuvieran el mismo nombre, verificar y arreglar!
#implementar
#creador de vinculo web de publicidad y tal vez una llave tipo key codificada
#para autor
#constantes
VERSION = "1.0"
#funciones
def limpiar():
"""Limpia consola"""
if os.name == "nt":
os.system("cls")
else:
os.system("clear")
def cifras(x=0):
"""cifras(x=0)
retorna la cantidad de digitos que tiene una cifra positiva"""
i = 0
if x == 0:
i = 1
elif x < 0:
i = -1
else:
while x > 0:
x = x / 10
i = i + 1
return i
#clases
class ListaArchivos():
"""ListaArchivos(directorio)
Operaciones con archivos"""
def __init__(self):
self._listaArchivos = [] #temporal
def __cargar(self, directorio):
"""cargar(self, directorio)
Carga el directorio, filtra los archivos
y prepara tareas para renombrado"""
#listado de directorios, archivos y
#filtrado de carpetas en la lista de archivos, nombre y extension por
#separado
self._listaArchivos = [os.path.splitext(archivo) for archivo in
os.listdir(directorio) if os.path.isfile(archivo)]
return "\n<!> %d archivos cargados" % len(self._listaArchivos)
def renombrar(self, directorio, opcion="-s"):
retorno = [self.__cargar(directorio)]
#nombre con el que se renombrara a los archivos
nuevoNombre = []
#procesado para cada archivo en la lista
for i, archivo in enumerate(self._listaArchivos, 1):
#secuencial
if "-s" in opcion:
nuevoNombre.append(str(i))
if "-i" in opcion:
#if separados ahorran espacio y permiten que al usuario poner
#nombre al inicio y al lo que un if-else o if-elif no dejaria
if 'i' in opcion:
#nombre al inicio
nuevoNombre.insert(0, opcion[opcion.index("i") + 1])
if 'f' in opcion:
#nombre al final
nuevoNombre.append(opcion[opcion.index("f") + 1])
#agregando extension de archivo
nuevoNombre.append(archivo[1])
#renombrando
try:
os.rename(''.join(archivo), ''.join(nuevoNombre))
except os.error:
print "<!> Error al renombrar archivo %d" % i
#mensaje
print "<%d> %s --> %s" % (i, (''.join(archivo)), (''.join(nuevoNombre)))
#reinicialización de variable
nuevoNombre = []
sleep(0.1)
retorno.append("\n<!> %d archivos renombrados" % len(self._listaArchivos))
return retorno
class FileRenamer():
"""Clase principal file renamer"""
def __init__(self):
self._listaArchivos = ListaArchivos()
def creditos(self):
"""Imprime creditos del autor: Mini_Nauta"""
print '''
|||| |||| || |||| || || |||| || ||| || || |||||||| |||
|| || || || || || || || || || || || || || || || || ||
|| || || || || || || || || || ||||||| || || || |||||||
|| || || || |||| || || |||| || || |||||| || || ||
\xb8 Mini_Nauta 2012
File Renamer %s
http://protohey.blogspot.com\n\n''' % VERSION
def ayuda(self, ayudaRapida=False):
"""Muestra la ayua del programa"""
if not ayudaRapida:
print '''
c cd Cambia el directorio si es valido. cd <directory>
h help Muestra informacion de ayuda.
r rename Renombra archivos. Vease help para mas info.
q quit Cierra el programa.\n'''
else:
print '''
| Comando | Ayuda
------------------------------------------------------------------
| c cd | Cambia el directorio si es valido. cd <directory>
| | cd.. cambia al directorio anterior.
|r rename | Renombra archivos. Por defecto -s
| | -s secuencialmente.
| | antiguo.
| | -i i <palabra inicio> f <palabra final> (xxxxxxxx01...)
| |
| h help | Muestra informacion de ayuda.
| q quit | Cierra el programa.
| exit |
Nota: si intenta renombrar con el mismo nombre los archivos, por ejemplo
aplicando r -s 2 veces recibirá un error para el archivo o cola de ellos.\n'''
def cambiarDirectorio(self, nuevoDirectorio=''):
"""cambiar_directorio(nuevoDirectorio)
Cambia de directorio"""
#valor de retorno
retorno = None
#quitando "cd ", se supone en todos los casos opcion == cd, cd.., cd ..
#por lo que no tienen directorio
#probando por "cd.."
if nuevoDirectorio == "cd..":
nuevoDirectorio = nuevoDirectorio[2:]
#probando con "cd " sin directorio
elif nuevoDirectorio == 'cd ':
nuevoDirectorio = nuevoDirectorio[2:]
#probando cuando es "cd .."
elif nuevoDirectorio == "cd ..":
nuevoDirectorio = nuevoDirectorio[3:]
#exepción, este viene con directorio
else:
nuevoDirectorio = nuevoDirectorio[3:]
#por si se arrastra una carpeta se le quita las " o las '
if len(nuevoDirectorio) != 0 or 1:
nuevoDirectorio = ''.join([char for char in nuevoDirectorio
if char != '"' and char != "'"])
#cambiando de directorio
try:
os.chdir(nuevoDirectorio)
except os.error:
retorno = "\n<!> Directorio no valido"
return retorno
def opciones(self, nota=None):
"""opciones(error=None)
Opciones del programa
nota(string): Define una nota de aviso para el usuario"""
#verificacion de nota
if nota != None:
if type(nota) == list:
for frase in nota:
print frase
else:
print nota
opcion = (raw_input("\n<->> ")).encode("utf-8")
if len(opcion) == 0:
nota = "\n<!> No se han ingresado comandos"
#recordar agregar los ayudas para comandos
elif opcion == "h" or opcion == "help":
limpiar()
self.ayuda(True)
raw_input()
elif opcion[0] == 'r' or opcion[:5] =="rename":
if opcion == "rename":
nota = self._listaArchivos.renombrar(os.getcwd(),
((opcion[6:]).split(' '))[1:])
else:
nota = self._listaArchivos.renombrar(os.getcwd(),
((opcion[1:]).split(' '))[1:])
elif opcion == "cd.." or opcion[0] == 'c' or opcion[:1] == "cd":
nota = self.cambiarDirectorio(opcion)
elif opcion == 'q' or opcion == "quit" or opcion == "exit":
limpiar()
print "\n\n\n\n"
self.creditos()
sleep(2)
exit()
else:
nota = "\n<!> Comando invalido"
limpiar()
#este es la nota retornada por cambiarDirectorio
self.iniciar(nota)
def iniciar(self, nota=None):
"""iniciar(nota=None)
Inicio de file renamer, similar a main loop
en otras aplicaciones
nota: parametro que sirve de puente entre opciones y cambiarDirectorio
pero que es necesario que pase por iniciar."""
self.creditos()
self.ayuda()
print "<-> Directorio actual: \"" + os.getcwd() + '\"'
#la nota se le pasa a opciones para que lo muestre
#si es que contiene alguna notificacion para el usuario
self.opciones(nota)
#main
def main():
fr = FileRenamer()
fr.iniciar()
if __name__ == '__main__':
main()