我正在尝试使用shutil.copytree:
shutil.copytree(SOURCE_DIR, TARGET_DIR, ignore=None)
此副本也包含在文件夹中。我只需要复制没有任何文件的文件夹。怎么做?
答案 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
选项,但在旧版本中不可用。