在Python中递归复制文件时跳过某些目录?
我想把一个文件夹里的所有内容复制到另一个文件夹,并且要递归地复制,也就是连里面的子文件夹和文件都要一起复制。我还想忽略一些文件,比如所有隐藏文件(也就是那些名字前面有“.”的文件)。复制完后,我还想对其他文件运行一个函数。这在命令行里很简单,但我需要用Python写个脚本。
我试过用shutil.copytree这个方法,它支持忽略某些文件,但我不知道怎么在复制每个文件的时候运行一个函数。我可能还需要在复制的时候检查一些其他条件,所以不能在所有文件复制完后再统一运行这个函数。我也试着看了os.walk,但没搞明白怎么用。
2 个回答
4
如果你使用的是Python 2.6或更高版本,你可以直接使用 shutil.copytree
这个功能,并且可以利用它的 ignore
参数。因为这个功能会把所有的文件和文件夹都传递给你,所以你可以在这里调用你的函数,除非你希望在文件被复制 之后立即 调用它。
如果是这种情况,最简单的方法就是复制并修改 copytree
的代码。
7
你可以使用 os.walk 来遍历每个文件,应用你自己的过滤函数,只复制你需要的文件。
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
通过从上到下或从下到上的方式,生成目录树中的文件名。对于树中每个目录(包括最顶层的目录),它会返回一个包含三个部分的元组(目录路径、目录名和文件名)。
你可以把所有复制的文件放到一个列表里,然后用这个列表来运行你自己的脚本,或者在每次复制操作后运行脚本。
这应该能帮你入门:
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('.')))