📜  Python - 复制没有文件的目录结构

📅  最后修改于: 2022-05-13 01:54:47.031000             🧑  作者: Mango

Python - 复制没有文件的目录结构

在本文中,我们将讨论如何使用Python复制带有文件的目录结构。例如,考虑这个目录树:

我们有一个名为“base”的文件夹,里面有一个名为“Structure”的文件夹。 “结构”有一些文件夹,其中也包含一些文件。现在我们必须将“Structure”的所有文件夹复制到名为“copied_structure”的文件夹中,这样文件就不会被复制。

在本文中,我们将讨论实现此目的的各种方法。

  • 使用shutil.copytree()
  • 使用 os.walk()

方法一:使用shutil.copytree()

使用shutil 库的shutil.copytree() 方法我们可以完成这个任务。 shutil.copytree() 方法递归地将以源 (src) 为根的整个目录树复制到目标目录。由 (dst) 命名的目标目录必须不存在。它将在复制期间创建。它需要一个可选参数,即“忽略”。如果给出了“ignore”,它必须是一个可调用对象,它将接收由copytree () 访问的目录作为其参数,以及由 os.listdir() 返回的其内容列表。为了更好地理解,让我们通过编写代码来实现这个方法。
将没有文件的“Structure”的目录结构复制到“copied_structure”的代码将是:



Python
# importing the shutil module
import shutil
 
# importing the os module
import os
 
# defining the function to ignore the files
# if present in any folder
def ignore_files(dir, files):
    return [f for f in files if os.path.isfile(os.path.join(dir, f))]
 
# calling the shutil.copytree() method and
# passing the src,dst,and ignore parameter
shutil.copytree('D:/projects/base/Structure',
                'D:/projects/base/copied_structure',
                ignore=ignore_files)


Python
# importing the os module
import os
 
# defining a function for the task
def create_dirtree_without_files(src, dst):
   
      # getting the absolute path of the source
    # direcrory
    src = os.path.abspath(src)
     
    # making a variable having the index till which
    # src string has directory and a path separator
    src_prefix = len(src) + len(os.path.sep)
     
    # making the destination directory
    os.makedirs(dst)
     
    # doing os walk in source directory
    for root, dirs, files in os.walk(src):
        for dirname in dirs:
           
            # here dst has destination directory,
            # root[src_prefix:] gives us relative
            # path from source directory
            # and dirname has folder names
            dirpath = os.path.join(dst, root[src_prefix:], dirname)
             
            # making the path which we made by
            # joining all of the above three
            os.mkdir(dirpath)
 
# calling the above function
create_dirtree_without_files('D:/projects/base/Structure',
                             'D:/projects/base/copied_structure')


运行上面的代码后,我们会发现创建了一个名为“copied_structure”的新文件夹,其中包含与“Structure”文件夹相同的文件夹结构,但“Structure”文件夹中没有任何文件。

方法二:使用 os.walk()

我们也可以通过使用 os 模块的 os.walk() 方法来实现上述任务。我们将通过访问源目录的每个目录并从源目录获取文件夹名称及其相对路径来完成此操作,然后通过此相对路径,我们将使用 os.mkdir() 在目标目录中复制它们.这个实现的代码是:

Python

# importing the os module
import os
 
# defining a function for the task
def create_dirtree_without_files(src, dst):
   
      # getting the absolute path of the source
    # direcrory
    src = os.path.abspath(src)
     
    # making a variable having the index till which
    # src string has directory and a path separator
    src_prefix = len(src) + len(os.path.sep)
     
    # making the destination directory
    os.makedirs(dst)
     
    # doing os walk in source directory
    for root, dirs, files in os.walk(src):
        for dirname in dirs:
           
            # here dst has destination directory,
            # root[src_prefix:] gives us relative
            # path from source directory
            # and dirname has folder names
            dirpath = os.path.join(dst, root[src_prefix:], dirname)
             
            # making the path which we made by
            # joining all of the above three
            os.mkdir(dirpath)
 
# calling the above function
create_dirtree_without_files('D:/projects/base/Structure',
                             'D:/projects/base/copied_structure')

运行此代码后,我们会发现创建了一个名为“copied_structure”的文件夹,该文件夹与“Structure”具有相同的目录结构,但其中没有文件。