我想以递归方式将目录复制到另一个目录。我也想忽略一些文件(例如所有隐藏文件;一切都以“。”开头),然后在所有其他文件上运行一个函数(复制后)。这在shell中很简单,但我需要一个Python脚本。
我尝试使用shutil.copytree,它忽略了支持,但我不知道如何让它在复制的每个文件上执行一个函数。我可能还需要在复制时检查一些其他条件,所以我不能只在复制完所有文件后运行该函数。我也试过看os.walk,但我无法理解。
答案 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
代码。