在 Python 中使用 shutil 仅复制目录树中的目录

Posted

技术标签:

【中文标题】在 Python 中使用 shutil 仅复制目录树中的目录【英文标题】:Copy only directories in a directory tree using shutil in Python 【发布时间】:2016-01-31 18:50:03 【问题描述】:

我正在尝试在 Python 中使用 shutil 复制目录树。

我是这样做的:

shutil.copytree(source,target,False,lambda x,y:[r for r in y if os.path.isfile(r)]);

其中source 是源目录的路径,target 是一个不存在的目录的名称,source 的副本将在该目录中发生。

第三个参数表示符号链接的处理方式。

根据我在documentation 中的理解,最后一个参数应该是一个输入两个参数并返回将从副本中排除的文件名列表的函数。第一个输入是当前目录的名称,shutil 递归遍历树,第二个输入是其内容列表。

这就是为什么我输入一个 lambda 试图返回列表中那些作为文件的元素。

但这不起作用。它正在复制一切。

我在哪里弄糊涂了?


如果我有的话,我想做的是

source\
  subdir1\
     file11.txt
     file12.txt
  subdir2\
     file21.txt

我要获取

target\
  subdir1\
  subdir2\

顺便说一句,我想我可以使用walkglob 自己编写副本,但我认为shutil 使用起来很简单。

【问题讨论】:

【参考方案1】:

这有什么改变吗?

shutil.copytree(source,target,symlinks=False,ignore=ignore_files);

def ignore_files(folder, files):
    return [f for f in files if not os.path.isdir(os.path.join(folder, f))]

【讨论】:

添加ignore = 并没有改变它。它仍然复制子目录和文件。 我明白了,文件列表需要完整路径。将is_dir 更改为os.path.isdir 是可行的。【参考方案2】:

发现很有趣,试试这个:

shutil.copytree(source,target,False,lambda x,y:[r for r in y if os.path.isfile(x+os.sep+r)]);

阅读this post 后,问题似乎是isfile 不理解isfile 直到你有一个完整的路径,我通过添加x+os.sep+r 重建它。

【讨论】:

以上是关于在 Python 中使用 shutil 仅复制目录树中的目录的主要内容,如果未能解决你的问题,请参考以下文章

Python 之 shutil模块使用

我可以选择在shutil中归档哪个文件吗? [复制]

Python之shutil模块

python- shutil 高级文件操作

python模块---shutil

Python shutil模块(目录和文件操作)