2013-07-09 11 views
2

shutil.copytree()를 호출 할 때 무시할 수있는 파일 및 디렉토리에 대한 전체 경로를 지정하고 싶습니다. 내가 대신 전체 경로 단순히 파일 이름을 반환하지 않는 한이 후python shutil.copytree()에 대한 Ignore 콜백은 전체 경로를 허용하지 않습니다.

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() visit; 디렉토리 당 파일을 무시합니다..

무시해야 할 파일의 전체 경로가있는 경우 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_paths 경로 목록입니까? 귀하의 코드를 시도하고 오류가 발생했습니다 : 파일 "/HelloCopytree.py", 28 행 my_ignore2에 return to_ignore.get (folder, set()) TypeError : get() 키워드 인수를 사용하지 않습니다 – kakyo

1

. copytree()은 한 번에 한 디렉토리의 내용을 복사하며 사용자가 반환하는 무시 목록에이라는 파일 이름을 특별히 찾습니다. 전체 경로는 절대 파일 이름이 아니므로 절대 일치하지 않습니다.

그러나, dir 매개 변수가 도움이 될 것입니다 당신은 당신이 원하는 일을 : 하나의 항목 만있을 때 세트에서

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