2016-11-28 45 views
0

我是Python的新手,並一直在教我自己的教科書和StackOverflow。我似乎從本網站的真實世界範例中學到了最好的東西。我希望有人能幫我解決我目前的問題。迭代(或遞歸?)過濾目錄並將結果複製到新目錄

我有一個包含大約1,000個文件的目錄(文件夾)。這些文件的名稱帶有前綴(模式),例如aaa_*bbb_*ccc_*等。我想遍歷目錄並複製所有具有指定前綴的文件,並將它們移動到具有該前綴名稱的新目錄中。例如,找到/my_dir_path中的所有aaa_*文件,並將它們複製到/my_new_dir_path/aaa以及同樣所有的bbb_*/my_new_dir_path/bbb。新的目錄已經被創建。

下面這個簡單,樣板,腳本適用於複製前綴樣式中的一個新的目錄:

dir = '/my_dir_path' 
pattern = 'aaa_*' 
dest = '/my_new_dir_path/aaa' 

for root, dirs, files in os.walk(dir): 
    for filename in fnmatch.filter(files, pattern): 
     source = (os.path.join(root, filename)) 
     shutil.copy2(source, dest) 

我正在掙扎是如何遞歸我的模式,然後列表運行fnmatch.filter最終將文件輸出到他們自己的目錄。

我試過用*args的模式列表編寫一些不同的函數定義,但通常會得到一個錯誤消息,即「filter()只需要2個參數(給出3)」。 (我很抱歉沒有代碼示例在這裏給你看,在過去的幾天裏我經歷了很多版本,所以我沒有任何一個代表性的函數定義。)

我是這樣的新手我不知道fnmatch.filter是否可以遞歸或如何設計一個替代策略。然後,存在如何將每個模式搜索的結果文件存儲到其自己的目錄中的問題。我想我可以創建一個字典事先說,例如,

my_dict = {'my_new_dir_path/aaa': 'aaa_*', 'my_new_dir_path/bbb': 'bbb_*'} 

和存儲所產生的文件,根據相應的鍵值,但考慮到我還沒有得到遞歸工作(即打印)我還沒有研究如何將結果複製到新目錄。

+0

我不清楚遞歸所需的結果。你是說你想要在多個層面移動文件嗎?用一個公共前綴重命名目錄? – Prune

+0

在原始目錄中,有文件:aaa_1,aaa_2,aaa_n,bbb_4,bbb_6,bbb_7等。我試圖隔離所有那些'aaa_ *'並將它們複製/移動到標記爲'aaa'的文件夾並所有'bbb_ *'並將它們移動到標記爲'bbb'的文件夾中。新的目錄(aaa,bbb等)已經被創建。 – user69339

回答

0

現在我還沒有測試過,因爲我沒有測試所有的文件。但是,我只是將「模式」變量列表並添加另一個循環。我也改變了「dest」變量,所以我們可以利用「模式」列表。

dir = '/my_dir_path' 
patterns = ['aaa', 'bbb', 'ccc'] 
dest = '/my_new_dir_path/' 

for root, dirs, files in os.walk(dir): 
    for pattern in patterns: 
     for filename in fnmatch.filter(files, pattern+'_*'): 
      source = (os.path.join(root, filename)) 
      shutil.copy2(source, dest+pattern+'/') 
+0

謝謝!第二個for循環完成了迭代。 (我把頭靠在牆上,因爲我用第二個循環開始了這個過程,現在我看到了我犯了錯誤的地方)。現在的任務是隔離所有'a-files'並將它們複製到它們自己的dir(.../aaa),併爲'b-files' - >(.../bbb)等做同樣的操作。目前,所有文件都被複制到一個目錄中。我想我需要將「for filename」循環的結果存儲到一系列列表或字典中,以便我可以將每個迭代複製到它自己的目錄中。我現在將使用該代碼。我會很樂意接受建議。再次感謝。 – user69339

+0

對不起,我在我的代碼中修正了一個錯誤。最初,我把最後一行作爲'shutil.copy2(source,dest +'pattern')'這將把所有文件放到一個名爲「destination」的目錄中。「現在這條線('shutil.copy2(source,dest + pattern +'/')'),它應該把這些文件放到它自己的目錄中,無論它現在在哪個」模式「列表中迭代。這就是原因我在模式列表中將「_ *」省略了,因此它也可以用作目標目錄的一部分,並且我還添加了+'/'作爲優化措施。 –

+1

我非常感謝您的幫助。 。在我昨晚關閉之前,我意識到我需要添加+'/',但是我沒有注意到'pattern'(字符串)錯誤。我一直在處理各種代碼版本,但它們都給出了相同的錯誤,模式被視爲一個字符串,我將這個錯誤添加到我的Python錯誤清單中,以便在對代碼進行故障診斷時尋找,並再次感謝學習機會併爲我節省了大量時間。 – user69339

相關問題