Script de cambio de nombre de archivos en python 3.5

publicado por: Anonymous

tengo que hacer un script en python 3.5 para que cambiar de nombre los archivos de una carpeta, pero el script no se me ejecuta, no sé por qué.
Gracias por vustra atención: Aquí os dejo el código:

import os
def rename_files ():
    # 1) Vamos a obtener el nombre de los archivos
   file_list = os.listdir ("D:prank")
   print (file_list)
   saved_path = os.getcwd ()


   print ("El directorio activo es " +str(saved_path))
   os.chdir("D:prank")

    # 2) Hacemos un bucle que los renombrará uno a uno:
   for file_name in file_list :
      os.rename (file_name, file_name.translate (None, "0123456789"))
os.chdir(saved_path)
rename_files()

solución

Por explicar un poco lo que viene en todos los comentarios. Tu código actual era:

import os

def rename_files():
    # 1) Vamos a obtener el nombre de los archivos
    file_list = os.listdir("D:prank")
    print(file_list)
    saved_path = os.getcwd()

    print("El directorio activo es " + str(saved_path))
    os.chdir("D:prank")

    # 2) Hacemos un bucle que los renombrará uno a uno:
    for file_name in file_list :
        os.rename(file_name, file_name.translate(None, "0123456789"))

os.chdir(saved_path)
rename_files()

Varias cosas.

  • No es necesario hacer func (). De hecho, se desaconseja usar un espacio en la llamada a la función. Mira aquí.

  • La variable saved_path la usas dentro de la función por lo que explícitamente está fuera del scope global. Para hacer que esté disponible en el scope desde donde la llamas deberías definirla en el scope en el que la quieres utilizar y podrías usar global o nonlocal pero no te lo recomiendo. En realidad no usas esa variable dentro de la función por lo que lo ideal sería que la definieras fuera de la función.

  • Cuando haces el for renombras todo lo que hay en file_list pero si ahí tienes cosas que no son ficheros (directorios, por ejemplo) también se renombrarán.

  • Si estás en Python 3 podrías usar la biblioteca pathlib para ayudarte en todo el proceso de renombrar y para tener en cuenta si es fichero, directorio, enlace,…

  • Estás usando file_name.translate pero ese método necesita la salida del método estático str.maketrans por lo que te derbería estar dando error.

  • Lo ideal sería que la función aceptase el path como argumento de tal forma que tu función sería reusable.

  • En windows tienes que tener cuidado cuando metes paths usando ya que si tienes, por ejemplo, "D:nueva_carpeta", la parte con n se te convertirá en un salto de línea. Para evitarlo puedes usar el string de las siguientes formas: r"D:nueva_carpeta" o "D:\nueva_carpeta".

Por lo que entiendo, en tu código quieres añadir 0123456789 a cada fichero y no sé si a cada directorio de la misma carpeta.

Tu código transformado podría ser algo como:

import pathlib

def rename_files(path, rename_dirs = False):
    print("El directorio activo es " + str(path))
    os.chdir(str(path))
    for f in path.iterdir():
        if rename_dirs and f.is_dir():
            f.rename(str(f) + '_0123456789') # añade _0123456789 al nombre del directorio
        if f.is_file():
            f.rename(str(f).replace(f.suffix, '_0123456789' + f.suffix)) # añade _0123456789 antes de la extensión del fichero

path = pathlib.Path(r'D:prank')
rename_files(path)

Esta solución solo es compatible con Python >= 3.4.x. En las etiquetas has usado python-3.x por lo que asumo que te valdrá. Si usas una versión anterior y no tienes muchas dependencias que te lo impidan deberías pensar en actualizarte.

Espero que te sirva de ayuda. Si no hace lo que deseas, por favor, rehaz la pregunta para poder adecuar el código.

Puedes ver más sobre pathlib en el maravilloso blog de @astrojuanlu.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *