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
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()).
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))
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
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)
'basename = os.path.normcase (basename)' zanim 'basename.endswith' może być użyteczne (w systemie Windows). – jfs
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")
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_))
@JF Sebastian: Dziękuję za usprawnienia! –