A veces necesitamos mover un directorio completo o tal vez hay una lista de dichos directorios, digamos A junto con su subcontenido, archivos y subcarpetas a otro directorio de destino B. Si bien esto se puede hacer manualmente ‘cortando’ y ‘pegando’ pero ¿qué pasa si hay cientos o miles de directorios que desea mover y mucho menos el error humano? Veamos cómo hacer esto fácilmente en python con pocas líneas de código usando el módulo shutil.
El módulo Shutil
Shutil proporciona una serie de funciones de alto nivel que ayudan a automatizar el proceso de copiar, mover o eliminar archivos o directorios, independientemente de la plataforma utilizada. Se incluye en los módulos de utilidad estándar de Python, por lo que no es necesario realizar una instalación por separado.
Tiene un método shutil.move() que mueve recursivamente un archivo o directorio (fuente) junto con su subcontenido a otra ubicación (destino) y devuelve el destino. Si el directorio de destino ya existe, la fuente se mueve dentro de ese directorio; de lo contrario, se crea un nuevo directorio antes de moverlo. Si el destino ya existe pero no es un directorio, es posible que se sobrescriba o genere un error según las especificaciones de os.rename() .
Sintaxis: shutil.move(origen, destino, copy_function = copy2)
Supongamos que la estructura del directorio se ve así:
donde ‘dest’ es nuestra carpeta de destino.
Ejemplo #1: Basado en una lista de directorios
Aquí hemos hecho una lista de directorios que queremos mover. En aras de la simplicidad, todos los directorios están en la misma carpeta, también puede moverse desde diferentes directorios base.
Python3
# import shutil module import shutil # import os module import os # base path base_path = 'C:/Users/Pulkit/GFG_Articles/root' # list of directories we want to move. dir_list = ['test2', 'test4', 'test5', 'does_not_exist'] # path to destination directory dest = os.path.join(base_path, 'dest') print("Before moving directories:") print(os.listdir(base_path)) # traverse each directory in dir_list for dir_ in dir_list: # create path to the directory in the # dir_list. source = os.path.join(base_path, dir_) # check if it is an existing directory if os.path.isdir(source): # move to destination path shutil.move(source, dest) print("After moving directories:") print(os.listdir(base_path))
Producción:
Antes de mover directorios:
[‘dest’, ‘test1’, ‘test2’, ‘test3’, ‘test4’, ‘test5’, ‘web_tools_express’, ‘web_tools_html’, ‘web_tools_node’, ‘web_tools_react’]
Después de mover directorios:
[‘destino’, ‘prueba1’, ‘prueba3’, ‘web_tools_express’, ‘web_tools_html’, ‘web_tools_node’, ‘web_tools_react’]
Verifiquemos la carpeta de destino, que es como:
Como puede ver, movimos todos los directorios y su contenido al directorio de destino (la ruta absoluta apunta al directorio ‘dest’).
Ejemplo #2: Basado en el patrón
Supongamos que queremos mover directorios que siguen un patrón de nombre específico a nuestro destino. Vamos a mover todos los directorios cuyo nombre comience con ‘web’. Puedes utilizar cualquier patrón según tus necesidades. Este sería un caso de uso más práctico donde tenemos cientos de directorios.
Python3
# import shutil module import shutil # import os module import os # base path base_path = 'C:/Users/Pulkit/GFG_Articles/root' # get all directories in our base path. all_dir = os.listdir(base_path) # path to destination directory dest = os.path.join(base_path, 'dest') print("Before moving directories:") print(os.listdir(base_path)) for dir_ in all_dir: # check if the dir_ follows the required # pattern. if dir_.startswith('web'): # create path to this directory. source = os.path.join(base_path, dir_) # move to destination path shutil.move(source, dest) print("After moving directories:") print(os.listdir(base_path))
Producción:
Antes de mover directorios:
[‘destino’, ‘prueba1’, ‘prueba3’, ‘web_tools_express’, ‘web_tools_html’, ‘web_tools_node’, ‘web_tools_react’]
Después de mover directorios:
[‘destino’, ‘prueba1’, ‘prueba3’]
Verifiquemos la carpeta de destino, que es como:
¡La carpeta de destino contiene todos los directorios del ejemplo anterior y este!
Publicación traducida automáticamente
Artículo escrito por pansaripulkit13 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA