Python-shutil.copytree递归提取不可选

Python-shutil.copytree递归提取不可选,python,python-2.7,Python,Python 2.7,我曾经尝试使用下面的代码将文件从存储介质导出到我的计算机。成功了。在这个过程中的某个地方,我一定对它进行了修改,因为它不是递归地获取带有我想要的扩展名的文件,而是获取源代码处的所有文件 def xxxlist(ext, dirname, names): ext = ext.lower() for name in names: if name.lower().endswith('.xxx'): # This is the file type I need.

我曾经尝试使用下面的代码将文件从存储介质导出到我的计算机。成功了。在这个过程中的某个地方,我一定对它进行了修改,因为它不是递归地获取带有我想要的扩展名的文件,而是获取源代码处的所有文件

def xxxlist(ext, dirname, names):
    ext = ext.lower() 
    for name in names:
        if name.lower().endswith('.xxx'): # This is the file type I need.
            print(os.path.join(dirname, name))

def xxxextract(src,dest):
        print 'Executing Extraction (may take a minute)...'
        dest_dir = os.path.dirname(dest)
        try:
            os.makedirs(dest_dir)
        except os.error as e:
            pass 
            shutil.copytree(src,dest)
        print "Successfully exported..." 
        os.path.walk(path, xxxlist, '.xxx')
下面是程序中的进一步说明。调用以下函数:

if args.extractpath:
    path = args.extractpath
        xxxextract(extractpath, 'Exports')

如您所见,它执行提取,然后列出所有我想要的xxx文件。但当我检查“Exports”文件夹时,所有内容都被传输了,不仅仅是扩展名。我如何解决这个问题,只需将其发送到shutil.copytree,并将扩展名设置为我想要的文件?

找到了一个解决方案!Jon Clements告诉我创建一个忽略列表并否定它。《代码中的梦想》中的蓝瓜帮我制作了一个:

def ignore_list(path, files):
   ret = []
   for fname in files:
        fullFileName = os.path.normpath(path) + os.sep + fname
   if not os.path.isdir(fullFileName) \
        and not fname.endswith('zdt'):
        ret.append(fname)
   return ret
这可用于
shutil.copytree(src、dst、ignore=ignore\u list)
。这是一个很好的方法:最初尝试lambda函数,但希望导出保持其文件夹结构