2008-11-17 18 views
18

Me gustaría copiar los archivos que tienen una extensión de archivo específica a una nueva carpeta. Tengo una idea de cómo usar os.walk, pero específicamente ¿cómo voy a usar eso? Estoy buscando los archivos con una extensión de archivo específica en una sola carpeta (esta carpeta tiene 2 subdirectorios, pero los archivos que estoy buscando nunca se encontrarán en estos 2 subdirectorios, así que no necesito buscar en estos subdirectorios) . Gracias por adelantado.¿Cómo copio archivos con una extensión de archivo específica a una carpeta en mi script python (versión 2.5)?

Respuesta

30
import glob, os, shutil 

files = glob.iglob(os.path.join(source_dir, "*.ext")) 
for file in files: 
    if os.path.isfile(file): 
     shutil.copy2(file, dest_dir) 

Lea la documentation del módulo shutil para elegir la función que se adapte a sus necesidades (shutil.copy(), shutil.copy2() o shutil.copyfile()).

+0

@JF Sebastian: ¡Gracias por las mejoras! –

1

Esto recorrerá un árbol con subdirectorios. Puede hacer una comprobación os.path.isfile para que sea un poco más seguro.

for root, dirs, files in os.walk(srcDir): 
    for file in files: 
     if file[-4:].lower() == '.jpg': 
      shutil.copy(os.path.join(root, file), os.path.join(dest, file)) 
+0

es un error usar '.lower()' en sistemas sensibles a mayúsculas y minúsculas (MS Windows es dominante pero no es un mundo entero). 'os.path.normcase (file)' es preferido en su lugar. – jfs

6

Si no está recurriendo, no necesita caminar().

La respuesta de Federico con glob está bien, asumiendo que no va a haber ningún directorio llamado 'something.ext'. De lo contrario tratar:

import os, shutil 

for basename in os.listdir(srcdir): 
    if basename.endswith('.ext'): 
     pathname = os.path.join(srcdir, basename) 
     if os.path.isfile(pathname): 
      shutil.copy2(pathname, dstdir) 
+0

'basename = os.path.normcase (basename)' before 'basename.endswith' podría ser útil (en Windows). – jfs

3

Aquí es una versión no recursiva con os.walk:

import fnmatch, os, shutil 

def copyfiles(srcdir, dstdir, filepattern): 
    def failed(exc): 
     raise exc 

    for dirpath, dirs, files in os.walk(srcdir, topdown=True, onerror=failed): 
     for file in fnmatch.filter(files, filepattern): 
      shutil.copy2(os.path.join(dirpath, file), dstdir) 
     break # no recursion 

Ejemplo:

copyfiles(".", "test", "*.ext") 
1

Copiar archivos con extensión "extensión" de SRCDIR a dstDir ...

import os, shutil, sys 

srcDir = sys.argv[1] 
dstDir = sys.argv[2] 
extension = sys.argv[3] 

print "Source Dir: ", srcDir, "\n", "Destination Dir: ",dstDir, "\n", "Extension: ", extension 

for root, dirs, files in os.walk(srcDir): 
    for file_ in files: 
     if file_.endswith(extension): 
      shutil.copy(os.path.join(root, file_), os.path.join(dstDir, file_)) 
Cuestiones relacionadas