【问题标题】:In python, how can I make an exact copy of a folder tree without the files?在 python 中,如何在没有文件的情况下制作文件夹树的精确副本?
【发布时间】:2020-11-05 12:01:30
【问题描述】:

我需要制作一个文件夹及其所有子文件夹的副本,但不要在目录中包含任何文件。

在 Python 中,我使用 os.walk 函数在目录中自上而下处理大量子文件夹中的大量图像。我想制作这个文件夹树的精确副本(os.walk 函数通过)并将它放在我指定的不同目录中。这是为了让我可以将输出图像保存在它们来自的文件夹的等效副本中。

我试过了:

from distutils.dir_util import copy_tree
copy_tree("/a/b/c", "/x/y/z")

但不知道如何将其编辑为我想要的。如何使用 python 命令将空文件夹树复制到我选择的目录?

我应该使用 shutil.copytree 命令还是应该在 for 循环中放入一些东西来处理图像或其他东西?

【问题讨论】:

  • 也许在您编写文件时创建输出目录会更容易,例如使用os.makedirs(..., exist_ok=True)
  • 同意马修。我也是这么想的。我个人可能会在您的 os.walk() 循环中编写代码,这样您只需在需要时创建目标目录,而不是预先创建所有目录。但是,如果在调用代码之前目标目录不存在,我发布了一个适用于 python 3.8 和以前版本的答案
  • 您提到在 os.walk() 循环中有代码,目标目录是在需要时创建的。在我的循环上下文中会是什么样子? (我是否直接将os.makedirs(..., exist_ok=True) 复制并粘贴到特定位置的循环中?)
  • 是的,这绝对是我想要的!谢谢你们!如果您需要os.makedirs(..., exist_ok=True) 的帮助,那么此链接可能会有所帮助:geeksforgeeks.org/python-os-makedirs-method

标签: python directory copy directory-structure directory-tree


【解决方案1】:

如果您愿意,可以使用shutil.copytree

它有一个ignore 参数,可以让您忽略复制的项目(在您的情况下忽略所有非目录)

import os
import shutil

def cptree(src, dst):

    def keep_only_dirs(path, files):
        to_ignore = [
            fname for fname in files
            if not os.path.isdir(os.path.join(path, fname))
            ]
        return to_ignore

    # This works for python3 (<3.8), BUT the target directory MUST not exist
    shutil.copytree(src, dst, ignore=keep_only_dirs)

    # For python 3.8 you can use following code (Here the target directory can
    # already exist and only new directories will be added
    # shutil.copytree(src, dst, ignore=keep_only_dirs, dirs_exist_ok=True)

或者,如果您没有 python3.8 并且希望能够使代码与现有目标目录一起工作,您可以使用 os.walk() 手工编写一些代码

如果这是你需要的告诉我,我会写一个例子。

【讨论】:

  • 我认为您的第一条评论是正确的:我可能应该尝试将其包含在代码中,而不是单独制作文件夹树。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 2015-01-18
  • 2017-05-22
  • 1970-01-01
  • 2021-07-29
相关资源
最近更新 更多