Python shutil copytree: используйте функцию игнорирования для хранения файлов определенных типов

Я пытаюсь понять, как копировать чертежи САПР (".dwg", ".dxf) из исходного каталога с подпапками в целевой каталог и поддерживать исходную структуру каталога и подпапок.

  • Оригинальный каталог: H:\ Танзания...\Bagamoyo_Single_line.dwg
  • Исходный каталог: H:\CAD\ Танзания...\Bagamoyo_Single_line.dwg

Я нашел следующий ответ от martineau в следующем посте: 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'))

Обновлено: 18:21. Следующий код работает должным образом, за исключением того, что я хотел бы игнорировать папки, которые не содержат include_patterns ('.dwg', '.dxf')

1 ответ

shutil уже содержит функцию ignore_patternТаким образом, вы не должны предоставлять свои собственные. Прямо из документации:

from shutil import copytree, ignore_patterns

copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))

Это скопирует все, кроме .pyc файлы и файлы или каталоги, чье имя начинается с tmp.

Это немного сложно (и не обязательно нужно), чтобы объяснить, что происходит: ignore_patterns возвращает функцию _ignore_patterns в качестве возвращаемого значения эта функция вставляется в copytree в качестве параметра, и copytree вызывает эту функцию по мере необходимости, так что вам не нужно знать или заботиться о том, как вызвать эту функцию _ignore_patterns, Это просто означает, что вы можете исключить некоторые ненужные файлы (например, *.pyc) от копирования. Тот факт, что имя функции _ignore_patterns начинается с подчеркивания - намек на то, что эта функция - деталь реализации, которую вы можете игнорировать.

copytree ожидает, что папка destination еще не существует Это не проблема, что эта папка и ее подпапки появляются однажды copytree начинает работать, copytree знает, как справиться с этим.

Сейчас include_patterns написано, чтобы сделать обратное: игнорировать все, что явно не включено. Но он работает так же: вы просто вызываете его, он возвращает функцию изнутри, и coptytree знает, что делать с этой функцией:

copytree(source, destination, ignore=include_patterns('*.dwg', '*.dxf'))
Другие вопросы по тегам