[Python 2.7.3] Renamer 1.0

Iniciado por flacc, 24 Marzo 2014, 06:00 AM

0 Miembros y 1 Visitante están viendo este tema.

flacc

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.

Código (python) [Seleccionar]
#!/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()