没有文件的shutil.copytree

时间:2013-03-27 16:12:03

标签: python shutil

我正在尝试使用shutil.copytree:

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

此副本也包含在文件夹中。我只需要复制没有任何文件的文件夹。怎么做?

5 个答案:

答案 0 :(得分:8)

你可以通过提供“忽略”功能

来做到这一点
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时,它将递归地转到每个子文件夹,并将该文件夹中的文件列表提供给ignore函数,以根据模式检查这些文件是否合适。被忽略的文件将作为函数末尾的列表返回,然后,copytree将只复制从该列表中排除的项目(在您的情况下,包含当前文件夹中的所有文件)

答案 1 :(得分:1)

您应该考虑使用os.walk

Here is an example for os.walk。这样,您可以列出所有目录,然后使用os.mkdir创建它们。

答案 2 :(得分: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)

答案 3 :(得分:0)

以下是@Oz123's solution的实施,该实施基于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)

答案 4 :(得分:0)

如果您想要使用from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt import numpy as np m = Basemap(width=12000000,height=9000000,projection='lcc', resolution='c',lat_1=45.,lat_2=55,lat_0=50,lon_0=-107.) m.drawcoastlines(linewidth=0.25) data = 100*np.random.rand(10,10) m.imshow(data, interpolation = 'none') plt.show() 忽略模式功能,则:

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选项,但在旧版本中不可用。