8

我对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

4 回答 4

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
于 2011-08-10T14:54:47.023 回答
6

shutil模块提供了一个功能ignore_patterns

此工厂函数创建一个函数,可用作 copytree() 的忽略参数的可调用函数,忽略与提供的 glob 样式模式之一匹配的文件和目录。

模块页面也显示了几个示例

于 2011-08-10T14:49:17.750 回答
0

如果给出了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 的目录处理。

于 2011-08-10T14:58:39.470 回答
0

忽略回调函数应返回与不应复制的“src”目录相关的名称列表。

您的示例回调不返回任何内容(即无)。然后copytree,期待一个列表,尝试迭代它。既然不能,你就会得到那个例外。

于 2011-08-10T14:51:35.077 回答