Copie un directorio recursivamente usando Python (con ejemplos)

El módulo Shutil en Python proporciona muchas funciones de operaciones de alto nivel en archivos y colecciones de archivos. Viene bajo los módulos de utilidad estándar de Python. Este módulo ayuda a automatizar el proceso de copia y eliminación de archivos y directorios.
El método shutil.copytree() copia recursivamente un árbol de directorios completo enraizado en el origen (src) al directorio de destino. El directorio de destino, nombrado por (dst) no debe existir todavía . Se creará durante la copia. Los permisos y tiempos de los directorios se copian con copystat() y los archivos individuales se copian usando shutil.copy2() .

Sintaxis: shutil.copytree(src, dst, symlinks = False, ignore = None, copy_function = copy2, ignore_dangling_symlinks = False)
Parámetros:  
src: Una string que representa la ruta del directorio fuente. 
dest: una string que representa la ruta del destino. 
Enlaces simbólicos (opcional): Este parámetro acepta Verdadero o Falso, según el cual se copiarán los metadatos de los enlaces originales o enlaces enlazados en el nuevo árbol. 
ignorar (opcional): si se proporciona ignorar, debe ser un invocable que recibirá como argumentos el directorio que está visitando copytree() y una lista de su contenido, tal como lo devuelve os.listdir(). 
copy_function (opcional):El valor predeterminado de este parámetro es copy2. Podemos usar otra función de copia como copy() para este parámetro. 
ignore_dangling_symlinks (opcional): el valor de este parámetro, cuando se establece en True, se usa para silenciar la excepción generada si el archivo señalado por el enlace simbólico no existe.
Valor devuelto: este método devuelve una string que representa la ruta del directorio recién creado. 
 

Ejemplo: Supongamos que el directorio se ve así. 

python-shutil.copytree

Queremos copiar la carpeta ‘src’ a una nueva carpeta ‘dst’. A continuación se muestra la implementación.

Python3

# Python program to explain shutil.copytree() method 
        
 
# importing shutil module 
import shutil 
    
# path 
path = 'D:/Pycharm projects/GeeksforGeeks/' 
    
# Source path 
src = 'D:/Pycharm projects/GeeksforGeeks/src'
    
# Destination path 
dest = 'D:/Pycharm projects/GeeksforGeeks/dst'
    
# Copy the content of 
# source to destination 
destination = shutil.copytree(src, dest) 
    
# print(destination) prints the
# path of newly created file

Producción:

python-shutil.copytree

Copie archivos y directorios

Modificar un poco el código anterior nos permite copiar tanto archivos como directorios. Esto se puede hacer usando la función copytree() y un bloque try-except. Capturaremos la excepción y, si la excepción es ENOTDIR, usaremos la función copy2() para copiar los archivos. Hacer esto nos permite copiar tanto archivos como directorios usando un solo código.

Supongamos que el directorio de destino se ve así.

python-copy-files-and-directories

Queremos copiar un archivo de texto presente en la carpeta src a esta carpeta de destino. A continuación se muestra la implementación. 

Python3

# Python program to demonstrate
# shutil.copytree()
 
 
# Importing module
import shutil
import errno
 
# Source path
src = 'D:/Pycharm projects/GeeksforGeeks/src/b/test_b.txt'
 
# Destination path
dest = 'D:/Pycharm projects/GeeksforGeeks/dst'
 
# Copy the content of
# source to destination
try:
    shutil.copytree(src, dest)
except OSError as err:
 
    # error caused if the source was not a directory
    if err.errno == errno.ENOTDIR:
        shutil.copy2(src, dest)
    else:
        print("Error: % s" % err)

Producción:

python-copy-files-and-directories

Ignorar archivos y directorios

A veces, al copiar un directorio a otro directorio, es posible que no desee copiar algunos archivos o subdirectorios. Incluso esto es manejado por el módulo shutil. La función copytree() toma el argumento ignore que permite especificar una función que devuelve una lista de directorios o archivos que deben ser ignorados. Esta función toma el nombre del archivo o directorio como un argumento que actúa como un filtro de nombres. Si el argumento pasado está en los nombres, entonces se agrega a una lista que especifica el copytree() qué archivo o directorio omitir.

Ejemplo: supongamos que la carpeta de origen se ve así. 

python-copy-files-and-directories

Queremos copiar el contenido de la carpeta anterior con la carpeta ‘a’. A continuación se muestra la implementación. 

Python3

# Python program to demonstrate
# shutil.copytree()
 
 
# importing modules
import shutil
 
# Declaring the ignore function
def ignoreFunc(file):
    def _ignore_(path, names):
         
        # List containing names of file
        # that are needed to ignore
        ignored = []
         
        # check if file in names
        # then add it to list
        if file in names:
            ignored.append(file)
        return set(ignored)
         
    return _ignore_
     
 
# Source path 
src = 'D:/Pycharm projects /GeeksforGeeks/src'
 
# Destination path 
dest = 'D:/Pycharm projects/GeeksforGeeks/dst'
 
# Copying the contents from Source
# to Destination without some
# specified files or directories
shutil.copytree(src, dest, ignore = ignoreFunc('a'))

Producción:

python-copy-files-and-directories

Para eliminar más de un archivo o un archivo con un formato particular, se usa shutil.ignore_patterns. Esta función se pasa como argumento al método copytree() que especifica los patrones globales para filtrar los archivos y directorios. 

Ejemplo: Usaremos la carpeta de origen anterior como ejemplo y no copiaremos ningún archivo .txt ni la carpeta ‘a’. A continuación se muestra la implementación. 

Python3

# Python program to demonstrate
# shutil.copytree()
 
 
# importing modules
import shutil
 
# Source path 
src = 'D:/Pycharm projects/GeeksforGeeks/src'
 
# Destination path 
dest = 'D:/Pycharm projects/GeeksforGeeks/dst'
 
# Copying the contents from Source
# to Destination without some
# specified files or directories
shutil.copytree(src, dest, ignore = shutil.ignore_patterns('*.txt', 'a'))

Producción:

python-copy-files-and-directories

Publicación traducida automáticamente

Artículo escrito por nikhilaggarwal3 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *