有没有一种方法可以使用目录的绝对路径来过滤目录?
shutil.copytree(directory,
target_dir,
ignore = shutil.ignore_patterns("/Full/Path/To/aDir/Common")) 当尝试过滤位于"aDir“下的”公共“目录时,这似乎不起作用。如果我这样做:
shutil.copytree(directory,
target_dir,
ignore = shutil.ignore_patterns("Common"))它可以工作,但每个名为Common的目录都会被过滤到那个“树”中,这不是我想要的。
有什么建议吗?
谢谢。
发布于 2011-10-21 05:01:46
您可以创建自己的ignore函数:
shutil.copytree('/Full/Path', 'target',
ignore=lambda directory, contents: ['Common'] if directory == '/Full/Path/To/aDir' else [])或者,如果您希望能够使用相对路径调用copytree:
import os.path
def ignorePath(path):
def ignoref(directory, contents):
return (f for f in contents if os.abspath(os.path.join(directory, f)) == path)
return ignoref
shutil.copytree('Path', 'target', ignore=ignorePath('/Full/Path/To/aDir/Common'))从文档中:
如果给定了ignore,则它必须是一个可调用函数,该函数将接收os.listdir()返回的由copytree()访问的目录及其内容列表作为其参数。因为copytree()是递归调用的,所以对于复制的每个目录,都会调用一次ignore callable。callable必须返回与当前目录相关的目录和文件名序列(即其第二个参数中的项的子集);然后在复制过程中将忽略这些名称。ignore_patterns()可用于创建忽略基于glob样式模式的名称的可调用对象。
发布于 2011-10-21 05:03:31
shutil.ignore_patterns()的API不支持绝对路径,但是使用您自己的变体非常容易。
作为起点,请看*ignore_patterns*的源代码
def ignore_patterns(*patterns):
"""Function that can be used as copytree() ignore parameter.
Patterns is a sequence of glob-style patterns
that are used to exclude files"""
def _ignore_patterns(path, names):
ignored_names = []
for pattern in patterns:
ignored_names.extend(fnmatch.filter(names, pattern))
return set(ignored_names)
return _ignore_patterns您可以看到,它返回一个接受路径和名称列表的函数,并返回一组要忽略的名称。为了支持您的用例,创建您自己的类似函数,该函数使用利用路径参数。将您的函数传递给copytree()调用中的ignore参数。
或者,不要按原样使用shutil。源代码短小精悍,因此很容易剪切、粘贴和定制。
发布于 2011-10-21 05:07:38
您可能希望创建自己的ignore函数,该函数检查正在处理的当前目录,并仅当目录为'/Full/Path/ to /aDir‘时才返回一个包含'Common’的列表。
def ignore_full_path_common(dir, files):
if dir == '/Full/Path/To/aDir':
return ['Common']
return []
shutil.copytree(directory, target_dir, ignore=ignore_full_path_common)https://stackoverflow.com/questions/7842044
复制相似问题