2011-08-10 28 views
8

Tôi tương đối mới với python. Tôi đang cố gắng sao chép một thư mục vào một thư mục khác duy trì cấu trúc.Cách viết chức năng gọi lại để bỏ qua trong shutil.copytree

Tôi đang sử dụng

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

Tôi cố gắng để viết một cuộc gọi trở lại chức năng cho bỏ qua.

Mục tiêu của tôi là lấy danh sách tệp trong danh sách và chỉ sao chép những tệp đó, bỏ qua phần còn lại. Làm cách nào để chuyển danh sách vào chức năng gọi lại?

Tôi đã viết một chức năng gọi lại đơn giản, nhưng tôi nhận được một số lỗi khi tôi cố gắng để chạy các chức năng 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 

Trả lời

7

Trả về hàm bỏ qua cần phải là danh sách các thư mục và tệp cần bỏ qua. Bạn không trả lại bất kỳ thứ gì, trả về None, vì vậy bạn gặp lỗi TypeError: argument of type 'NoneType' is not iterable.

Dưới đây là một ví dụ mà sẽ sao chép cấu trúc thư mục và các tập tin được liệt kê trong '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

Bạn có nghĩa là 'return [f cho f trong các tập tin nếu không phải là is_dir (os.path.join (thư mục, f)) và f không trong copy_these]'. –

+2

Hiểu danh sách tốt. Nhưng, vì người hỏi nói anh ta mới với Python, một phong cách tiết tú hơn có thể dễ hiểu và thích ứng hơn. – jwhitlock

6

Module shutil cung cấp một chức năng ignore_patterns.

Chức năng nhà máy này tạo ra một hàm có thể được dùng làm đối số bỏ qua của copytree(), bỏ qua tệp và thư mục khớp với một trong các mẫu kiểu được cung cấp.

Trang mô-đun cũng hiển thị a couple of examples.

+0

Điều này hoạt động hoàn hảo nếu bạn cố gắng bỏ qua một loại tệp (đó là những gì tôi đang tìm kiếm). –

0

Chức năng gọi lại bỏ qua sẽ trả về danh sách tên liên quan đến thư mục 'src' không được sao chép.

Gọi lại ví dụ của bạn không trả về gì (ví dụ: Không có). Sau đó copytree, mong đợi một danh sách, cố gắng lặp lại nó. Vì nó không thể, bạn nhận được ngoại lệ đó.

0

Nếu bỏ qua được đưa ra, nó phải là một callable rằng sẽ nhận được như các đối số của nó thư mục đang được truy cập ... và danh sách nội dung của nó ... Các cuộc gọi phải trả về một chuỗi các tên thư mục và tập tin liên quan đến thư mục hiện tại ...; những tên này sau đó sẽ bị bỏ qua trong quá trình sao chép.

(docs)

Mục đích của tôi là để có một danh sách các tập tin trong một danh sách

Hãy thử một chức năng ẩn danh (lambda) và một danh sách hiểu:

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))]) 

Lưu ý rằng chức năng lambda lấy tên nền của các tệp và d irectories, không phải con đường đầy đủ của họ; kudos @ jwhitlock's để xử lý thư mục.

Các vấn đề liên quan