Как написать функцию обратного вызова для игнорирования в shutil.copytree - PullRequest
8 голосов
/ 10 августа 2011

Я относительно новичок в питоне. Я пытаюсь скопировать каталог в другой каталог, сохраняя структуру.

Я использую

    shutil.copytree(src, dst, symlinks=False, ignore=None, 
    copy_function=copy2, ignore_dangling_symlinks=False)

Я пытаюсь написать функцию обратного вызова для игнорирования.

Моя цель - взять список файлов в списке и скопировать только эти файлы, игнорируя остальные. Как мы передаем список в функцию обратного вызова?

Я написал простую функцию обратного вызова, но при попытке запустить функцию 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:\Python32\lib\shutil.py", line 204, in copytree
if name in ignored_names:
  TypeError: argument of type 'NoneType' is not iterable

Ответы [ 4 ]

7 голосов
/ 10 августа 2011

Возвращаемым значением функции 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
6 голосов
/ 10 августа 2011

Модуль шутил обеспечивает функцию ignore_patterns.

Эта фабричная функция создает функцию, которую можно использовать в качестве вызываемого для аргумента игнорирования copytree (), игнорируя файлы и каталоги, которые соответствуют одному из предоставленных шаблонов типа glob.

На странице модуля показана пара примеров .

0 голосов
/ 10 августа 2011

Если задано ignore , это должен быть вызываемый объект, который в качестве аргументов получит посещаемый каталог ... и список его содержимого ... Вызываемый должен возвращать последовательность каталога и имена файлов относительно текущего каталога ...; затем эти имена будут игнорироваться в процессе копирования.

( документы )

Моя цель - взять список файлов в списке

Попробуйте анонимную функцию (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 получает базовые имена файлов и каталогов, а не их полные пути; слава @ jwhitlock за обработку каталогов.

0 голосов
/ 10 августа 2011

Функция обратного вызова ignore должна возвращать список имен, относящихся к каталогу 'src', которые не следует копировать.

Ваш пример обратного вызова ничего не возвращает (т. Е. Нет).Затем copytree, ожидая список, пытается перебрать его.Поскольку это невозможно, вы получите это исключение.

...