Как написать функцию обратного вызова для 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 для обработки каталогов.