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'))