2013-07-09 53 views
2

我想在調用shutil.copytree()時指定可忽略文件和目錄的完整路徑。類似於python shutil.copytree()的忽略回調不接受完整路徑

def my_ignore(dir, files): 

    # return ["exclude.file"] # working 

    return ["/full_path_to/exclude.file"] # Not working 

shutil.copytree(src, dest, ignore=my_ignore) 

在此之後,排除的文件仍然存在,除非我簡單地返回文件名而不是完整路徑。事情是我真的想建立一個特定的文件,而不是在不同的目錄下的所有匹配的文件名。

我提到了一些問題,在這裏,如: How to write a call back function for ignore in shutil.copytree

Filter directory when using shutil.copytree?

但沒有答案的工作。它看起來像忽略掛鉤只能返回一個glob風格,任何構造的完整路徑將無法工作。

我錯過了什麼嗎?

回答

1

ignore確實必須只返回被忽略的文件名。但是,爲每個目錄shutil.copytree()訪問調用該函數;你可以忽略文件每個目錄

如果您有需要忽略的文件的完整路徑,則匹配傳遞給您的ignore函數的第一個參數;它是該目錄的完整路徑:

def my_ignore(dir, files): 
    if dir == '/full_path_to': 
     return {"exclude.file"} 

我在這裏返回一組;設置成員資格測試比列表更快。

如果您有一組預定義的要忽略的路徑,請將其解析爲字典;鍵是目錄路徑,值設置文件名在該路徑:

from collections import defaultdict 

to_ignore = defaultdict(set) 
for path in ignored_paths: 
    dirname, filename = os.path.split(path) 
    to_ignore[dirname].add(filename) 

def my_ignore(src, files): 
    return to_ignore.get(src, set()) 
+0

會員測試並不比列表更快時,只有一個項目。 :-) – kindall

+0

@ kindall:我懷疑這一次只限於一個文件名。 –

+0

@MartijnPieters ignored_pa​​ths路徑列表?我嘗試了你的代碼,並得到一個錯誤:文件「/HelloCopytree.py」,第28行,在my_ignore2 返回to_ignore.get(文件夾,設置()) TypeError:get()沒有關鍵字參數 – kakyo

1

這不是魔術。 copytree()一次複製一個目錄的內容,它專門在您返回的忽略列表中查找文件名。完整路徑永遠不會是文件的名稱,因此永遠不會匹配。

然而,dir參數會幫你做你想要什麼:一組

def my_ignore(dir, files): 
    if dir == "/full/path/to": 
     return ["exclude.file"] 
    else: 
     return []