我想递归复制一个目录到另一个目录。我也想忽略一些文件(例如,所有隐藏的文件;以“。”开头的所有文件),然后在所有其他文件上(复制它们之后)运行一个函数。这在shell中很简单,但我需要一个Python脚本。在Python中跳过一些目录递归复制文件?
我试过使用shutil.copytree,它忽略了支持,但我不知道如何让它在复制的每个文件上做一个函数。我可能还需要在复制时检查其他一些条件,以便在复制完所有文件后,我不能只运行该功能。我也试着看os.walk,但我无法弄清楚。
我想递归复制一个目录到另一个目录。我也想忽略一些文件(例如,所有隐藏的文件;以“。”开头的所有文件),然后在所有其他文件上(复制它们之后)运行一个函数。这在shell中很简单,但我需要一个Python脚本。在Python中跳过一些目录递归复制文件?
我试过使用shutil.copytree,它忽略了支持,但我不知道如何让它在复制的每个文件上做一个函数。我可能还需要在复制时检查其他一些条件,以便在复制完所有文件后,我不能只运行该功能。我也试着看os.walk,但我无法弄清楚。
您可以使用os.walk遍历每个文件,应用您的自定义过滤功能并仅复制您关心的那些文件。
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
步行树无论是自上而下还是自下而上生成的目录树中的文件名。对于根目录顶部(包括顶部本身)树中的每个目录,它会生成一个3元组(dirpath,dirnames,文件名)。
您可以将所有复制的文件添加到列表中,并使用它运行自定义脚本或在每次复制操作后运行脚本。
这应该让你开始:
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('.')))
如果你对Python的2.6或更高版本,你可以简单地使用shutil.copytree
及其ignore
说法。由于它通过了所有的文件和目录,你可以从那里调用你的函数,除非你想在之后立即调用复制文件。
如果是这样,最简单的事情就是复制和修改copytree
的代码。
我也想支持Python 2.5,但这不是一个硬性要求。另外,请参阅我对编辑的回答,但我无法弄清楚如何将自定义函数应用于每个复制文件(满足某些条件)。 – VPeric
告诉我们你试过了什么,以及你卡在哪里。 – utdemir
@utdemir确定,添加了几行,这是更好吗? – VPeric
“运行文件上的函数”是什么意思?你打算打开并阅读它们,或者什么? –