Digamos que queremos copiar o mover archivos y directorios, pero no queremos hacerlo llamando a comandos de shell. El módulo shutil tiene implementaciones portátiles de funciones para copiar archivos y directorios.
Código n. ° 1: uso del módulo shutil
import shutil # Copy src to dst. (cp src dst) shutil.copy(src, dst) # Copy files, but preserve metadata (cp -p src dst) shutil.copy2(src, dst) # Copy directory tree (cp -R src dst) shutil.copytree(src, dst) # Move src to dst (mv src dst) shutil.move(src, dst)
Los argumentos de estas funciones son todas strings que proporcionan nombres de archivos o directorios. La semántica subyacente intenta emular la de comandos similares de Unix, como se muestra en los comentarios. De forma predeterminada, los enlaces simbólicos van seguidos de estos comandos. Por ejemplo, si el archivo de origen es un vínculo simbólico, el archivo de destino será una copia del archivo al que apunta el vínculo.
Para copiar el enlace simbólico en su lugar, proporcione el argumento de palabra clave follow_symlinks como se muestra en el siguiente código:
Código #2:
shutil.copy2(src, dst, follow_symlinks = False) # To preserve symbolic links in copied directories shutil.copytree(src, dst, symlinks = True)
Opcionalmente copytree()
, permite ignorar ciertos archivos y directorios durante el proceso de copia. Para hacer esto, proporcione una función de ignorar que tome un nombre de directorio y una lista de nombres de archivo como entrada y, como resultado, devuelva una lista de nombres para ignorar. El ejemplo se muestra en el siguiente código:
Código #3:
def ignore_pyc_files(dirname, filenames): return [name in filenames if name.endswith('.pyc')] shutil.copytree(src, dst, ignore = ignore_pyc_files)
Dado que ignorar los patrones de nombre de archivo es común, ya se ha proporcionado una función de utilidad ignore_patterns()
para hacerlo, como se muestra en el código que se proporciona a continuación.
Código #4:
shutil.copytree(src, dst, ignore = shutil.ignore_patterns('*~', '*.pyc'))
¿Cómo funciona?
- El uso de shutil para copiar archivos y directorios es bastante sencillo.
- Sin embargo, una precaución con respecto a los metadatos de los archivos es que las funciones como copy2() solo hacen el mejor esfuerzo para preservar estos datos.
- La información básica, como las horas de acceso, las horas de creación y los permisos, siempre se conservará, pero la conservación de propietarios, ACL, bifurcaciones de recursos y otros metadatos de archivos extendidos puede o no funcionar según el sistema operativo subyacente y el del usuario. permisos de acceso.
- El usuario probablemente no quiera usar una función como shutil.copytree() para realizar copias de seguridad del sistema.
Cuando trabaje con nombres de archivo, asegúrese de usar las funciones para os.path
obtener la mayor portabilidad (especialmente si trabaja con Unix y Windows).
Código #5: Ejemplo
filename = '/Users/gfg/programs/abc.py' import os.path os.path.basename(filename)
'abc.py'
os.path.dirname(filename)
'/Users/gfg/programs'
os.path.split(filename)
('/Users/gfg/programs', 'abc.py')
os.path.join('/new/dir', os.path.basename(filename))
'/new/dir/spam.py'
os.path.expanduser('~/gfg/programs/spam.py')
'/Users/gfg/programs/abc.py'
Un poco complicado sobre la copia de directorios copytree()
es el manejo de errores. Por ejemplo, en el proceso de copia, la función puede encontrar enlaces simbólicos rotos, archivos a los que no se puede acceder debido a problemas de permisos, etc.
Publicación traducida automáticamente
Artículo escrito por manikachandna97 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA