2011-08-10 13 views
8

Soy relativamente nuevo en python. Estoy intentando copiar un directorio a otro directorio manteniendo la estructura.Cómo escribir una función de devolución de llamada para ignorar en shutil.copytree

estoy usando

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

Estoy intentando escribir una función llamada de vuelta para pasar por alto.

Mi objetivo es tomar una lista de archivos en una lista, y copiar solo esos archivos, haciendo caso omiso del resto. ¿Cómo pasamos una lista a la función de devolución de llamada?

me escribió una simple función de devolución de llamada, pero me da un error cuando trato de ejecutar la función 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 

Respuesta

7

El retorno de la función de ignorar debe ser una lista de directorios y archivos para ignorar. No devuelve nada, que devuelve None, por lo que está obteniendo el error TypeError: argument of type 'NoneType' is not iterable.

He aquí un ejemplo que copiará la estructura de carpetas y los archivos que aparecen en '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

Quiere decir 'return [f para archivos f si is_dir (os.path.join (carpeta, f)) yf no en copy_these]'. –

+2

Buena comprensión de la lista. Pero, como asker dijo que es nuevo en Python, un estilo más detallado podría ser más fácil de entender y adaptar. – jwhitlock

6

shutil El módulo proporciona una función ignore_patterns.

fábrica Esta función crea una función que se puede utilizar como un exigible para copytree() ‘s ignoran argumento, haciendo caso omiso de los archivos y directorios que coinciden con uno de los patrones de estilo pegote previstas.

La página del módulo muestra también a couple of examples.

+0

Esto funciona perfectamente si intenta ignorar un tipo de archivo (que es lo que estaba buscando). –

0

La función de devolución de llamada ignorada debe devolver una lista de nombres relativos al directorio 'src' que no deberían copiarse.

Su devolución de llamada de ejemplo no devuelve nada (es decir, ninguna). Entonces copytree, esperando una lista, intenta iterar sobre ella. Como no puede, obtienes esa excepción.

0

Si ignoran se da, que debe ser un exigible que recibirá como sus argumentos al directorio que se está visitando ... y una lista de sus contenidos ... El invocable debe devolver una secuencia de directorio y nombres de archivo relativos al directorio actual ...; estos nombres serán ignorados en el proceso de copia.

(docs)

Mi objetivo es tomar una lista de archivos en una lista

intentar una función anónima (lambda) y una lista de comprensión:

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

Tenga en cuenta que la función lambda obtiene los valores básicos de los archivos yd irectories, no sus caminos completos; kudos @ jwhitlock's para el manejo del directorio.

Cuestiones relacionadas