我对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
答案 0 :(得分:7)
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
答案 1 :(得分:6)
shutil模块提供ignore_patterns
功能。
此工厂函数创建一个函数,该函数可用作copytree()的ignore参数的可调用对象,忽略与提供的其中一个glob样式模式匹配的文件和目录。
模块页面也显示a couple of examples。
答案 2 :(得分:0)
忽略回调函数应返回相对于'src'目录的名称列表,该列表不应复制。
您的示例回调不返回任何内容(即无)。然后copytree,期待一个列表,试图迭代它。因为它不能,你得到那个例外。
答案 3 :(得分:0)
如果给出了 ignore ,它必须是一个可调用的,它将接收被访问的目录作为其参数...及其内容列表...可调用的必须返回一个目录序列和相对于当前目录的文件名...;这些名称将在复制过程中被忽略。
(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用于目录处理。