簡體   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