2011-08-10 8 views
8

나는 비교적 새로운 Python이다. 구조를 유지하는 다른 디렉토리에 디렉토리를 복사하려고합니다. 내가 무시에 대한 기능을 전화를 다시 쓰기 위해 노력하고 있어요shutil.copytree에서 무시를 위해 콜백 함수를 작성하는 방법

shutil.copytree(src, dst, symlinks=False, ignore=None, 
    copy_function=copy2, ignore_dangling_symlinks=False) 

사용하고

.

내 목표는 목록에있는 파일 목록을 가져와 나머지 파일은 무시하고 해당 파일 만 복사하는 것입니다. 어떻게 콜백 함수에 목록을 전달합니까?

나는 간단한 콜백 기능을 썼다,하지만 난 copyTree 기능

def abc(src,names): 
    print(src) 
    print(names) 



    Traceback (most recent call last): 
    File "<pyshell#23>", line 1, in <module> 
shutil.copytree('D:\Mytest','D:\PythonTestDest3',symlinks=False,ignore=abc) 
    File "C:\Python32\lib\shutil.py", line 204, in copytree 
if name in ignored_names: 
    TypeError: argument of type 'NoneType' is not iterable 

답변

7

ignore 함수를 반환하면 무시할 디렉토리 및 파일 목록이어야합니다. 반환 값은 None이므로 아무 것도 반환하지 않으므로 오류 TypeError: argument of type 'NoneType' is not iterable이 표시됩니다. 여기

폴더 구조와 'copy_these'에 나열된 파일을 복사합니다 예입니다 : 이 주어 무시하면, 그것의 인수로받을 것입니다 호출해야합니다

import os.path 

copy_these = ['a.txt', 'b.txt', 'c.txt'] 

def ignore_most(folder, files): 

    ignore_list = [] 
    for file in files: 
     full_path = os.path.join(folder, file) 
     if not os.path.isdir(full_path): 
      if file not in copy_these: 
       ignore_list.append(file) 
    return ignore_list 
+1

'is_dir (os.path.join (folder, f))이 아니고 f가 copy_these에 없다면 '파일에서 f [f를 반환]을 의미합니다. –

+2

좋은 목록 이해력. 그러나 질문자가 Python에 익숙하지 않다고 말하면서,보다 장황한 스타일은 더 이해하기 쉽고 적응하기 쉽습니다. – jwhitlock

6

shutil 모듈은 ignore_patterns 기능을 제공을 실행하려고 할 때 약간의 오류가 발생합니다.

이 공장 기능은 copytree에 대한 호출로 사용할 수있는 기능을() '는의가 제공하는 글로브 스타일의 패턴 중 하나와 일치하는 파일과 디렉토리를 무시하고 인수를 무시 만듭니다.

모듈 페이지에는 a couple of examples도 표시됩니다.

+0

파일 형식 (내가 찾고있는 형식)을 무시하려고하면이 작업이 완벽하게 작동합니다. –

0

ignore 콜백 함수는 복사해서는 안되는 'src'디렉토리에 상대적인 이름 목록을 반환해야합니다.

예제 콜백은 아무 것도 반환하지 않습니다 (즉, 없음). 그런 다음 목록을 기대하는 copytree가 반복을 시도합니다. 그럴 수 없으므로 예외가 발생합니다.

0

을 디렉토리 방문 중 ... 그리고 그 내용 목록 ... 호출 가능 파일은 현재 디렉토리와 관련된 디렉토리 및 파일 이름의 시퀀스를 리턴해야합니다 ...; 이러한 이름은 복사 프로세스에서 무시됩니다.

copytree(src, dest, 
     ignore=lambda d, files: [f for f in files 
            if f not in files_to_copy 
            and not is_dir(os.path.join(d, f))]) 
:

(docs)는

내 목표는

는 익명 함수 (lambda) 및 지능형리스트를 시도 목록에있는 파일의 목록을하는 것입니다

lambda 함수는 파일의 basename과 d 그들의 전체 경로가 아닌, judit @ jwhitlock은 디렉토리 처리에 사용됩니다.

관련 문제