2008-11-17 8 views
18

Je souhaite copier les fichiers ayant une extension de fichier spécifique dans un nouveau dossier. J'ai une idée comment utiliser os.walk mais spécifiquement comment pourrais-je l'utiliser? Je recherche les fichiers avec une extension de fichier spécifique dans un seul dossier (ce dossier a 2 sous-répertoires mais les fichiers que je cherche ne seront jamais trouvés dans ces 2 sous-répertoires, donc je n'ai pas besoin de chercher dans ces sous-répertoires) . Merci d'avance.Comment copier des fichiers avec une extension de fichier spécifique dans un dossier de mon script python (version 2.5)?

Répondre

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) 

Lire le documentation du module shutil de choisir la fonction qui correspond à vos besoins (shutil.copy(), shutil.copy2() ou shutil.copyfile()).

+0

@JF Sebastian: Merci pour les améliorations! –

1

Ceci va marcher dans un arbre avec des sous-répertoires. Vous pouvez faire un contrôle os.path.isfile pour le rendre un peu plus sûr.

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

c'est une erreur d'utiliser '.lower()' sur les systèmes sensibles à la casse (MS Windows est dominant mais ce n'est pas un monde entier). 'os.path.normcase (fichier)' est préféré à la place. – jfs

6

Si vous n'êtes pas récursif, vous n'avez pas besoin de walk().

La réponse de Federico avec glob est correcte, en supposant que vous n'allez pas avoir de répertoires appelés 'something.ext'. Sinon, essayez:

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)' avant 'basename.endswith' pourrait être utile (sous Windows). – jfs

3

Voici une version non récurrente avec 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 

Exemple:

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

Copier les fichiers avec l'extension "extension" de SRCDIR à 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_)) 
Questions connexes