我想遞歸複製一個目錄到另一個目錄。我也想忽略一些文件(例如,所有隱藏的文件;以「。」開頭的所有文件),然後在所有其他文件上(複製它們之後)運行一個函數。這在shell中很簡單,但我需要一個Python腳本。在Python中跳過一些目錄遞歸複製文件?
我試過使用shutil.copytree,它忽略了支持,但我不知道如何讓它在複製的每個文件上做一個函數。我可能還需要在複製時檢查其他一些條件,以便在複製完所有文件後,我不能只運行該功能。我也試着看os.walk,但我無法弄清楚。
我想遞歸複製一個目錄到另一個目錄。我也想忽略一些文件(例如,所有隱藏的文件;以「。」開頭的所有文件),然後在所有其他文件上(複製它們之後)運行一個函數。這在shell中很簡單,但我需要一個Python腳本。在Python中跳過一些目錄遞歸複製文件?
我試過使用shutil.copytree,它忽略了支持,但我不知道如何讓它在複製的每個文件上做一個函數。我可能還需要在複製時檢查其他一些條件,以便在複製完所有文件後,我不能只運行該功能。我也試着看os.walk,但我無法弄清楚。
您可以使用os.walk遍歷每個文件,應用您的自定義過濾功能並僅複製您關心的那些文件。
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
步行樹無論是自上而下還是自下而上生成的目錄樹中的文件名。對於根目錄頂部(包括頂部本身)樹中的每個目錄,它會生成一個3元組(dirpath,dirnames,文件名)。
您可以將所有複製的文件添加到列表中,並使用它運行自定義腳本或在每次複製操作後運行腳本。
這應該讓你開始:
import os
def filterls(src, filter_func):
for root, dirs, files in os.walk(src):
for f in files:
if filter_func(f):
path = os.path.join(root, f)
yield path[len(src)+1:]
它需要一個目錄路徑並帶有一個參數的函數。如果函數爲傳入的文件名返回False,則該文件將被忽略。
,您可以嘗試在Python解釋是這樣的:
# Get a list of all visible files rooted in the 'path/to/the/dir' directory
print list(filterls('path/to/the/dir', lambda p: not p.startswith('.')))
如果你對Python的2.6或更高版本,你可以簡單地使用shutil.copytree
及其ignore
說法。由於它通過了所有的文件和目錄,你可以從那裏調用你的函數,除非你想在之後立即調用複製文件。
如果是這樣,最簡單的事情就是複製和修改copytree
的代碼。
我也想支持Python 2.5,但這不是一個硬性要求。另外,請參閱我對編輯的回答,但我無法弄清楚如何將自定義函數應用於每個複製文件(滿足某些條件)。 – VPeric
告訴我們你試過了什麼,以及你卡在哪裏。 – utdemir
@utdemir確定,添加了幾行,這是更好嗎? – VPeric
「運行文件上的函數」是什麼意思?你打算打開並閱讀它們,或者什麼? –