2008-11-17 8 views
18

Chciałbym skopiować pliki, które mają określone rozszerzenie pliku do nowego folderu. Mam pomysł, jak używać os.walk, ale w jaki sposób powinienem użyć tego? Szukam plików o określonym rozszerzeniu w tylko jednym folderze (ten folder ma 2 podkatalogi, ale pliki, których szukam, nigdy nie zostaną znalezione w tych 2 podkatalogach, więc nie trzeba wyszukiwać w tych podkatalogach) . Z góry dziękuję.Jak skopiować pliki o określonym rozszerzeniu do folderu w moim skrypcie python (wersja 2.5)?

Odpowiedz

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) 

Przeczytaj documentation modułu shutil wybrać funkcję, która odpowiada Twoim potrzebom (shutil.copy(), shutil.copy2() lub shutil.copyfile()).

+0

@JF Sebastian: Dziękuję za usprawnienia! –

1

Spowoduje to przejście drzewa z podkatalogami. Możesz zrobić sprawdzenie os.path.isfile, aby było trochę bezpieczniej.

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

jest to błąd użycia '.lower()' w systemach rozróżniających wielkość liter (MS Windows jest dominujący, ale nie jest to cały świat). Zamiast tego preferowany jest plik "os.path.normcase (plik)". – jfs

6

Jeśli nie powtarzasz, nie musisz chodzić().

Odpowiedź Federico z globem jest w porządku, zakładając, że nie będzie żadnych katalogów o nazwie "something.ext". W przeciwnym razie spróbuj:

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)' zanim 'basename.endswith' może być użyteczne (w systemie Windows). – jfs

3

Oto nierekursywnych wersja z 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 

Przykład:

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

Kopiowanie plików z rozszerzeniem "rozszerzenie" z SRCDIR do 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_))