繁体   English   中英

Python:如何将特定文件从一个位置复制到另一位置并保持目录结构

[英]Python: How to copy specific files from one location to another and keep directory structure

嗨,我在努力用一些python代码将文件夹中的特定文件复制到另一个文件夹,同时保持目录结构。

我正在学习,因此使用发现的各种代码段将这些代码组合在一起,找不到与我的情况完全匹配的内容,并且我对python的了解还不够,无法理解我哪里出错了

def filtered_copy(src_dir, dest_dir, filter):
print 'Copying files named ' + filter + ' in ' + src_dir + ' to ' + dest_dir
ignore_func = lambda d, files: [f for f in files if isfile(join(d, f)) and f != filter]
if os.path.exists(dest_dir):
    print 'deleting existing data'
    shutil.rmtree(dest_dir)
copytree(src_dir, dest_dir, ignore=ignore_func)

像这样执行这段代码

filtered_copy(c:\foldertosearch, c:\foldertocopyto, 'settings.xml') 

确实跨我想要的文件进行复制,但没有跨父文件夹(即src_dir)进行复制,因此我要实现的结果是:

C:\\ foldertocopyto \\ foldertosearch \\ settings.xml中

***编辑-阐明这是一个将在多个操作系统上使用的脚本

因此,如果文件夹结构更复杂,即

上层资料夹
-subfolder
--subsubfolder
---- subsubsubfolder
------的settings.xml

我跑了

filtered_copy(subsubsubfolder, foldertocopyto, 'settings.xml')

我希望新的文件夹结构是

foldertocopyto(此上方可能有更多父文件夹)
--subsubsubfolder
----的settings.xml

换句话说,我在其中搜索特定文件的文件夹也应复制到该文件夹​​中;如果该文件夹已存在,则应在复制该文件夹和文件之前将其删除

我以为copytree()会做这部分-但显然不行!

***编辑结束

***最新代码更改

这行得通,但我敢肯定这是一个漫长的过程,它也复制了空白文件夹,大概是因为执行了copytree(),我只希望搜索的文件夹和过滤的文件...

def filtered_copy(src_dir, dest_dir, filter):
foldername = os.path.basename(os.path.normpath(src_dir))
print 'Copying files named ' + filter + ' in ' + src_dir + ' to ' + dest_dir + '/' + foldername
ignore_func = lambda d, files: [f for f in files if isfile(join(d, f)) and f != filter]
if os.path.exists(dest_dir + '/' + foldername):
    print 'deleting existing data'
    shutil.rmtree(dest_dir)
copytree(src_dir, dest_dir + '/' + foldername, ignore=ignore_func)

***最新代码更改结束

您可以使用distutils.dir_util.copy_tree 它工作得很好,您不必传递每个参数,只有src和dst是必需的。

但是,在您的情况下,您不能使用shutil.copytree类的类似工具,因为它的行为有所不同:由于目标目录一定不存在,因此该函数不能用于覆盖其内容

尝试下面的示例代码:

def recursive_overwrite(src, dest, ignore=None):
if os.path.isdir(src):
    if not os.path.isdir(dest):
        os.makedirs(dest)
    files = os.listdir(src)
    if ignore is not None:
        ignored = ignore(src, files)
    else:
        ignored = set()
    for f in files:
        if f not in ignored:
            recursive_overwrite(os.path.join(src, f), 
                                os.path.join(dest, f), 
                                ignore)
else:
    shutil.copyfile(src, dest)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM