2016-12-01 14 views
0

我有許多文件對象,我希望根據用戶陳述的要求重新部署到具有新結構的目錄。將文件部署到Python中具有自定義結構的目錄

作爲例子可以擁有這些文件的對象:

1)root\name\date\type\filename 
2)root\name\date\type\filename 
3)root\name\date\type\filename 

...我想保存(或它們的副本)中象下面這樣新的結構之後,用戶定義的需要分割型 - >日期 - >名稱:

1)root\type\date\name\filename 
2)root\type\date\name\filename 
3)root\type\date\name\filename 

...甚至失去水平,如:

1)root\type\filename 
2)root\type\filename 
3)root\type\filename 

我只能拿出伴t他可以選擇漫長的過程,採用初始列表,儘管過濾只需使用基本字符串操作在新計算的文件夾結構中進行部署即可。

雖然我覺得有人可能以聰明的方式做過這件事,並且可能已經存在一個庫/模塊來做到這一點。有沒有人有任何想法?

回答

0

如果您在UNIX環境中,更簡單的方法是使用帶有cp命令的shell腳本。

例如,對於從複製所有文件:/根/名稱/日期/類型/文件名作爲/根/日期/文件名;你只是需要做:

cp /root/*/date/*/filename /root/date/filename 

,或者,如果你要移動的文件,使用mv命令:

mv /root/*/date/*/filename /root/date/filename 

您可以使用os.system()作爲以及運行通過Python這些命令

import os 
os.system("cp \root\*\date\*\filename root\date\filename") 

有關詳細信息,請檢查:Calling an external command in Python


編輯根據評論。對於複製/根/名稱/日期/類型/文件名/根/日期/名稱/類型/文件名,你只是需要做的:

cp /root/name/date/type/filename /root/date/name/type/filename 

但要確保目錄/根/日期/名稱/型號之前存在。爲了確保它的存在,如果不使用mkdir-p選項,創建一個目錄:

mkdir -p /root/date/name/type 
+0

確定這可以工作,但我仍然有問題。你在上面的例子中的*是什麼?你將如何使用這種方法將/ root/name/date/type/filename轉換爲/ root/date/name/type/filename? – user3535074

+0

'*'表示介於兩者之間的東西。檢查我的編輯的細節 –

0

下面是使用Python glob一個解決方案:

目前的水平是:姓名,日期,類型和文件名:

curr_levels = "name\\date\\type\\filename" 
curr_levels = curr_levels.split("\\") 

用戶希望其他級別:類型,日期,名稱和文件名:

user_levels = "type\\date\\name\\filename" 
user_levels = user_levels.split("\\") 

我們可以使用glob.iglob在4個層次上迭代樹結構。 glob模式類似於:<src_dir>\*\*\*\*(但是,我們在此使用更通用的方式)。

用戶結構可以用簡單的字符串格式定義。 例如:Windows上的{type}\{date}\{name}\{filename}。 Wee需要先創建目錄結構,然後複製(或移動)文件。

pattern = os.path.join(source_dir, *("*" * len(curr_levels))) 
fmt = os.sep.join(['{{{key}}}'.format(key=key) for key in user_levels]) 

for source_path in glob.iglob(pattern): 
    source_relpath = os.path.relpath(source_path, source_dir) 
    parts = source_relpath.split(os.sep) 
    values = dict(zip(curr_levels, parts)) 
    target_relpath = fmt.format(**values) 
    target_path = os.path.join(target_dir, target_relpath) 
    parent_dir = os.path.dirname(target_path) 
    if not os.path.exists(parent_dir): 
     os.makedirs(parent_dir) 
    shutil.copy2(source_path, target_path) 

注意:如果您的source_dir相同target_dir(你的問題的root),您需要通過glob.glob以文件的整個列表存儲在內存中處理之前更換glob.iglob。這是必需的,以避免glob.iglob瀏覽你正在創建的目錄樹...

相關問題