Estoy tratando de descubrir cómo copiar dibujos CAD (".dwg", ".dxf) desde un directorio de origen con subcarpetas a un directorio de destino y mantener la estructura original de directorios y subcarpetas.
Encontré la siguiente respuesta de @martineau en la siguiente publicación: Python Factory Function
from fnmatch import fnmatch, filter from os.path import isdir, join from shutil import copytree def include_patterns(*patterns): """Factory function that can be used with copytree() ignore parameter. Arguments define a sequence of glob-style patterns that are used to specify what files to NOT ignore. Creates and returns a function that determines this for each directory in the file hierarchy rooted at the source directory when used with shutil.copytree(). """ def _ignore_patterns(path, names): keep = set(name for pattern in patterns for name in filter(names, pattern)) ignore = set(name for name in names if name not in keep and not isdir(join(path, name))) return ignore return _ignore_patterns # sample usage copytree(src_directory, dst_directory, ignore=include_patterns('*.dwg', '*.dxf'))Actualizado: 18:21. El siguiente código funciona como se esperaba, excepto que me gustaría ignorar las carpetas que no contienen include_patterns(' .dwg', ' .dxf')
shutil ya contiene una función ignore_patterns , por lo que no es necesario que proporcione la suya propia. Directamente de la documentación :
from shutil import copytree, ignore_patterns copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))Esto copiará todo excepto los archivos
.pycy los archivos o directorios cuyo nombre comience contmp.
Es un poco complicado (y no estrictamente necesario) explicar lo que está pasando: ignore_patterns devuelve una función _ignore_patterns como su valor de retorno, esta función se mete en copytree como un parámetro, y copytree llama a esta función según sea necesario, por lo que no tiene saber o preocuparse cómo llamar a esta función _ignore_patterns . Simplemente significa que puede excluir ciertos archivos cruft innecesarios (como *.pyc ) para que no se copien. El hecho de que el nombre de la función _ignore_patterns comience con un guión bajo es una pista de que esta función es un detalle de implementación que puede ignorar.
copytree espera que el destination de la carpeta aún no exista. No es un problema que esta carpeta y sus subcarpetas surjan una vez que copytree comience a funcionar, copytree sabe cómo manejar eso.
Ahora include_patterns está escrito para hacer lo contrario: ignorar todo lo que no está incluido explícitamente. Pero funciona de la misma manera: simplemente lo llama, devuelve una función oculta y coptytree sabe qué hacer con esa función:
copytree(source, destination, ignore=include_patterns('*.dwg', '*.dxf'))