我试图使用shutil.copytree。
shutil.copytree(SOURCE_DIR, TARGET_DIR, ignore=None)
复制文件夹中的文件 我需要只复制文件夹,没有任何文件。如何做到这一点?
你可以通过提供一个 "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将只复制不包括在该列表中的项目(在你的例子中,该列表包含了当前文件夹中的所有文件)。
你应该考虑使用 os.walk
.
下面是os.walk的一个例子. 这样你就可以列出所有的目录,然后用以下方法创建它们 os.mkdir
.
使用 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)
这里有一个实现 @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)
如果你想用 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
这在旧版本上是不可用的。