¿Crear un script de cambio de nombre por lotes en Python?

¿Crear un script de cambio de nombre por lotes en Python?

En primer lugar, esta pregunta se hizo como continuación de mi pregunta anterior:¿Cómo cambiar el nombre de archivos por lotes con "variables"?. Sólo lo repito teniendo en cuenta las recomendaciones de Sergey.

Utilizo xmbc para ver mis programas de televisión. Antes de comenzar a usar xmbc, descargué por lotes las primeras temporadas de "Bleach". Qué puedo decir, soy fanático del anime ;-). Estos se denominan: "bleachxx.mp4" donde xx es el número de episodio con respecto a toda la serie, no a la temporada. entonces "bleach21.mp4" es el primer episodio de la segunda temporada y el 21 en general. Sin embargo, los archivos en sí están divididos en sus propias carpetas de temporada.

El problema es que el comando cambiará el nombre de todos los archivos a "Bleach S0XExx", pero debido a que los archivos tienen los números de archivo generales, blanqueador52.mp4 --> 'Bleach S03E52.mp4' cuando obviamente no hay 52 episodios en la temporada 3.

Para resolver este problema, tendría que restar el número de episodios de las temporadas anteriores por el número total y básicamente obtener el número de temporada específico.

Ejemplo: si hay 20 episodios en la temporada 1, entonces 25-20 = 5, por lo que el episodio 25 es el quinto de la temporada 2 y el cambio de nombre se realizará normalmente.

Soy un completo novato en codificación, solo sugerí un script en Python porque me dijeron que era una forma efectiva de resolver este problema. ¿Alguien puede ayudarme en el proceso paso a paso de escribir este guión? ¡Gracias!

Respuesta1

Esto está fuera de lo común, pero intenta:

# call program as: epirename.py /path/to/mp4files 20 41 59
# the numbers are the sequence of first episodes in each season after the first
import os
import re
import sys
mp4dir = sys.argv[1]
seasons = [int(startnum) for startnum in sys.argv[2:]]
seasons.insert(0, 0) # start with '0' as the first episode of season 1
season = 0
patt = re.compile(r'([[:alpha:]]+)([[:digit:]]+).mp4')
for filename in sorted(os.listdir(mp4dir)):
    match = patt.search(filename)
    if match:
        episode = int(match.group(2))
        try:
            if episode >= seasons[season+1]:
                season += 1
        except:
            pass
        # create new filename as '{basename}S{season}E{episode}'
        newname = '%sS%02dE%03d.mp4' % (match.group(1), season+1, episode - seasons[season])
        os.rename(os.path.join(dir, filename),
                  os.path.join(dir, newname))
        print 'renamed', filename 'to', newname

El resultado es que los archivos que coincidan con '{name}{epi}.mp4' pasarán a llamarse '{name}S{season}E{episode}.mp4'. Otros archivos quedan intactos.

Una vez más, esto se me escapa de la cabeza; puede haber técnicas más eficientes.

información relacionada