2012-03-31 52 views
1

中將忽略模式移動到樹上我可以將包含文件和文件夾的整個目錄複製到本身的文件夾中,同時忽略某些文件夾和內容。如何使用shutil.copytree在python

source = htpc.root 
destination = os.path.join(htpc.root, "old") 

shutil.copytree(source, destination, ignore=shutil.ignore_patterns('userdata', 'old')) 

有沒有辦法做到這一點完全一樣的東西,除了移動,而不是在根目錄下的所有內舊舊的文件和文件夾複製,所以我就只能留給用戶數據和舊。任何援助將是偉大的。謝謝

+1

我不知道這樣做的任何現有的方式,而是hackish的解決辦法可能是包裝你的''shutil.ignore_patters()' '在記錄文件移動的東西(通過獲得函數的輸入和輸出之間的區別),然後刪除這些文件 - 但是,在這一點上,它可能僅僅是值得實現自己的''movetree''。 – 2012-03-31 11:58:34

回答

0

shutil模塊不提供該功能。

可以看到的copytree()功能,和其他人,在該文件中:shutil.py

也許位於:/usr/local/python2.6/shutil.py

有9個功能,shutil pydoc

因爲copytree是如此接近你需要什麼了,我會通過克隆copytree()到一個新的功能,然後調整它來移動而不是拷貝接近這個。

要做到這一點:

查找shutil.py您的系統和開放的文本編輯器/ IDE。

找到這行:

def copytree(src, dst, symlinks=False, ignore=None): 

複製一切從這裏到copytree功能的結束。

然後粘貼到您的代碼和重命名爲類似def moveWithIgnore(src, ...move2(..)

在原始copytree()函數頂部的註釋說copy2()做'工作'。在shutils.py你可以看到它需要(src, dst)作爲參數。

同樣在shutils是move()功能,這也需要(src, dst)。在新的moveWithIgnore函數中,將copy2替換爲move看起來是安全的。

原來copytree()函數使用遞歸(它調用本身)。一定要更新新函數中的代碼行,以便它自己調用而不是copytree。

我敢肯定,你可以把它從這裏:-)