在Python中通过跳过某些目录递归复制文件?

在Python中通过跳过某些目录递归复制文件?,python,Python,我想递归地将一个目录复制到另一个目录。我还想忽略一些文件(例如,所有隐藏文件;所有以“.”开头的文件),然后在所有其他文件上运行一个函数(复制它们之后)。这在shell中很简单,但我需要一个Python脚本 我尝试使用shutil.copytree,它提供了ignore支持,但我不知道如何让它对每个复制的文件执行一个函数。在复制时,我可能还需要检查一些其他条件,这样我就不能在复制完所有文件后对其运行该函数。我还试着查看os.walk,但我想不出答案。您可以使用它来迭代每个文件,应用自定义筛选功能

我想递归地将一个目录复制到另一个目录。我还想忽略一些文件(例如,所有隐藏文件;所有以“.”开头的文件),然后在所有其他文件上运行一个函数(复制它们之后)。这在shell中很简单,但我需要一个Python脚本

我尝试使用shutil.copytree,它提供了ignore支持,但我不知道如何让它对每个复制的文件执行一个函数。在复制时,我可能还需要检查一些其他条件,这样我就不能在复制完所有文件后对其运行该函数。我还试着查看os.walk,但我想不出答案。

您可以使用它来迭代每个文件,应用自定义筛选功能,并仅复制您关心的文件

通过自顶向下或自底向上遍历目录树来生成目录树中的文件名。对于树中以目录top为根的每个目录(包括top本身),它将生成一个3元组(dirpath、dirnames、filenames)

您可以将所有复制的文件添加到列表中,并使用它运行自定义脚本或在每次复制操作后运行脚本

这应该让你开始:

import os

def filterls(src, filter_func):
    for root, dirs, files in os.walk(src):
        for f in files:
            if filter_func(f):
                path = os.path.join(root, f)
                yield path[len(src)+1:]
它采用一个目录路径和一个采用单个参数的函数。如果函数对传递的文件名返回False,则忽略该文件

您可以在python解释器中进行如下尝试:

# Get a list of all visible files rooted in the 'path/to/the/dir' directory
print list(filterls('path/to/the/dir', lambda p: not p.startswith('.')))

如果您使用的是Python2.6或更高版本,只需使用
shutil.copytree
及其
ignore
参数即可。因为它会传递所有文件和目录,所以您可以从那里调用函数,除非您希望在复制文件后立即调用它


如果是这种情况,最简单的方法就是复制和修改
复制树
代码。

告诉我们您尝试了什么,以及您遇到了什么问题。@utdemir ok,添加了几行,这样更好吗?您所说的“在文件上运行函数”是什么意思?你打算打开并阅读它们吗?我也想支持Python2.5,但这不是一个硬性要求。另外,请参见我的编辑以获得答案,但我无法确定如何将自定义函数应用于每个复制的文件(满足某些条件)。我尝试了os.walk,但有点困惑。你能举个例子吗?
# Get a list of all visible files rooted in the 'path/to/the/dir' directory
print list(filterls('path/to/the/dir', lambda p: not p.startswith('.')))