Как написать функцию обратного вызова для ignore в shutil.copytree
Я относительно новичок в python. Я пытаюсь скопировать каталог в другой каталог, поддерживающий структуру.
Я использую
shutil.copytree(src, dst, symlinks=False, ignore=None,
copy_function=copy2, ignore_dangling_symlinks=False)
Я пытаюсь написать функцию обратного вызова для ignore.
моя цель-взять список файлов в списке и скопировать только эти файлы,игнорируя остальные. Как передать список в функцию обратного вызова?
Я написал простую функцию обратного вызова, но я получаю некоторую ошибку, когда пытаюсь запустить copyTree функция
def abc(src,names):
print(src)
print(names)
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
shutil.copytree('D:Mytest','D:PythonTestDest3',symlinks=False,ignore=abc)
File "C:Python32libshutil.py", line 204, in copytree
if name in ignored_names:
TypeError: argument of type 'NoneType' is not iterable
4 ответов
возврат функции ignore должен быть списком каталогов и файлов для игнорирования. Вы ничего не возвращаете, что возвращает None
, таким образом, вы получаете ошибку TypeError: argument of type 'NoneType' is not iterable
.
вот пример, который будет копировать структуру папок и файлы, перечисленные в "copy_these":
import os.path
copy_these = ['a.txt', 'b.txt', 'c.txt']
def ignore_most(folder, files):
ignore_list = []
for file in files:
full_path = os.path.join(folder, file)
if not os.path.isdir(full_path):
if file not in copy_these:
ignore_list.append(file)
return ignore_list
на shutil модуль обеспечивает ignore_patterns
.
эта заводская функция создает функцию, которая может использоваться в качестве вызываемого аргумента игнорирования copytree (), игнорируя файлы и каталоги, соответствующие одному из предоставленных шаблонов стиля glob.
страница модуля показывает несколько примеров как хорошо.
функция игнорировать обратный вызов должна возвращать список имен относительно каталога "src", который не должен быть скопирован.
ваш пример обратного вызова ничего не возвращает (т. е. Никто.) Затем copytree, ожидая список, пытается повторить его. Поскольку это невозможно, вы получаете это исключение.
если игнорировать дается, он должен быть вызываемым, который получит в качестве своих аргументов посещаемый каталог ... и список его содержания ... Вызываемый объект должен возвращать последовательность имен каталогов и файлов относительно текущего каталога ...; эти имена будут игнорироваться в процессе копирования.
(docs)
моя цель состоит в том, чтобы взять список файлов в списке
попробуйте анонимная функция (lambda
) и список осмысления:
copytree(src, dest,
ignore=lambda d, files: [f for f in files
if f not in files_to_copy
and not is_dir(os.path.join(d, f))])
отметим, что lambda
функция получает базовые имена файлов и каталогов, а не их полные пути; kudos @jwhitlock для обработки каталогов.