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

时间:2011-08-01 20:28:59

标签: python

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

我尝试使用shutil.copytree,它忽略了支持,但我不知道如何让它在复制的每个文件上执行一个函数。我可能还需要在复制时检查一些其他条件,所以我不能只在复制完所有文件后运行该函数。我也试过看os.walk,但我无法理解。

2 个答案:

答案 0 :(得分:7)

您可以使用os.walk迭代每个文件,应用自定义过滤功能并仅复制您关注的文件。

os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
     

通过从上到下或从下到上走树来生成目录树中的文件名。对于以目录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('.')))

答案 1 :(得分:4)

如果您使用的是Python 2.6或更高版本,则只需使用shutil.copytree及其ignore参数即可。由于它传递了所有文件和目录,你可以从那里调用你的函数,除非你希望在复制文件之后立即调用它。

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