[英]How to select and copy files with specific file names from one directory to another?
[英]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.