如何为shutil.copytree编写忽略的回调函数

8 投票
4 回答
6863 浏览
提问于 2025-04-16 23:17

我对Python还比较陌生,正在尝试把一个文件夹复制到另一个文件夹,同时保持原有的结构。

我正在使用

    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 个回答

0

忽略回调函数应该返回一个列表,这个列表里是相对于'src'目录的那些不应该被复制的文件名。

你给的例子里,回调函数什么都没返回(也就是返回了None)。然后,copytree函数期待能得到一个列表,于是它试图去遍历这个列表。但因为它遍历不到任何东西,所以就出现了那个错误。

6

shutil模块提供了一个ignore_patterns函数。

这个工厂函数会创建一个可以用作copytree()函数中忽略参数的函数,它会忽略那些与提供的某个模式匹配的文件和目录。这里的模式是类似于通配符的格式。

模块页面上还有一些示例供你参考。

7

忽略函数的返回值需要是一个要忽略的目录和文件的列表。你没有返回任何东西,这样就返回了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

撰写回答