无文件的shutil.copytree

问题描述 投票:12回答:5

我试图使用shutil.copytree。

shutil.copytree(SOURCE_DIR, TARGET_DIR, ignore=None)

复制文件夹中的文件 我需要只复制文件夹,没有任何文件。如何做到这一点?

python shutil
5个回答
11
投票

你可以通过提供一个 "ignore "函数来实现。

def ig_f(dir, files):
    return [f for f in files if os.path.isfile(os.path.join(dir, f))]

shutil.copytree(SRC, DES, ignore=ig_f)

基本上,当你调用 拷贝树它将递归到每个子文件夹,并向忽略函数提供该文件夹中的文件列表,以根据模式检查这些文件是否合适。被忽略的文件将在函数结束时以列表形式返回,然后,copytree将只复制不包括在该列表中的项目(在你的例子中,该列表包含了当前文件夹中的所有文件)。


1
投票

你应该考虑使用 os.walk.

下面是os.walk的一个例子. 这样你就可以列出所有的目录,然后用以下方法创建它们 os.mkdir.


1
投票

使用 distutils.dir_util.create_tree 只复制目录结构(不是文件

files 是一个文件名的列表。如果你想要一些能像shutils.copytree一样工作的东西。

import os
import distutils.dir_util
def copy_tree(source, dest, **kwargs):
    filenames = [os.path.join(path, file_) for path, _, files in os.walk(source) for file_ in files]
    distutils.dir_util.create_tree(dest, filenames, **kwargs)

1
投票

这里有一个实现 @Oz123的解决方案 它是基于 os.walk():

import os

def create_empty_dirtree(srcdir, dstdir, onerror=None):
    srcdir = os.path.abspath(srcdir)
    srcdir_prefix = len(srcdir) + len(os.path.sep)
    os.makedirs(dstdir)
    for root, dirs, files in os.walk(srcdir, onerror=onerror):
        for dirname in dirs:
            dirpath = os.path.join(dstdir, root[srcdir_prefix:], dirname)
            try:
                os.mkdir(dirpath)
            except OSError as e:
                if onerror is not None:
                    onerror(e)

1
投票

如果你想用 os.walk()那么,。

ignorePatterns=[".git"]
def create_empty_dirtree(src, dest, onerror=None):
    src = os.path.abspath(src)
    src_prefix = len(src) + len(os.path.sep)
    for root, dirs, files in os.walk(src, onerror=onerror):
        for pattern in ignorePatterns:
            if pattern in root:
                break
        else:
            #If the above break didn't work, this part will be executed
            for dirname in dirs:
                for pattern in ignorePatterns:
                    if pattern in dirname:
                        break
                else:
                    #If the above break didn't work, this part will be executed
                    dirpath = os.path.join(dest, root[src_prefix:], dirname)
                    try:
                        os.makedirs(dirpath,exist_ok=True)
                    except OSError as e:
                        if onerror is not None:
                            onerror(e)
                continue #If the above else didn't executed, this will be reached

        continue #If the above else didn't executed, this will be reached

这将忽略 .git 目录。

注意:这需要 Python >=3.2 因为我用 exist_ok 选项与 makedirs 这在旧版本上是不可用的。

© www.soinside.com 2019 - 2024. All rights reserved.