2010-08-03 5 views
51

Как скопировать все файлы в один каталог на другой в python. У меня есть исходный путь и путь назначения в строке.копировать несколько файлов в python

+0

[Как скопировать весь каталог файлов в существующий каталог с помощью Python?] (Http://stackoverflow.com/questions/1868714/how-do-i-copy -an-whole-directory-of-files-in-existing-directory-using-pyth) –

ответ

69

Вы можете использовать os.listdir(), чтобы получить файлы в исходном каталоге, os.path.isfile(), чтобы увидеть, если они являются обычными файлами (в том числе символических ссылок на системах * NIX) и shutil.copy сделать копирование.

Следующий код копирует только обычные файлы из исходного каталога в целевой каталог (я предполагаю, что вы не хотите, чтобы какие-либо подкаталоги копировались).

import os 
import shutil 
src_files = os.listdir(src) 
for file_name in src_files: 
    full_file_name = os.path.join(src, file_name) 
    if (os.path.isfile(full_file_name)): 
     shutil.copy(full_file_name, dest) 
7

Посмотрите на shutil in the Python docs, в частности на команду copytree.

+0

Хорошее замечание, но это может быть не вариант, если каталог по какой-то причине существует, как в моем случае. – Sven

12

Если вы не хотите копировать все дерево (с поддиретами и т. Д.), Используйте или glob.glob("path/to/dir/*.*"), чтобы получить список всех имен файлов, перебрать их по списку и использовать shutil.copy для копирования каждого файла.

for filename in glob.glob(os.path.join(source_dir, '*.*')): 
    shutil.copy(filename, dest_dir) 
+1

Примечание. Возможно, вам придется проверить результаты glob с помощью os.path.isfile(), чтобы убедиться, что они являются именами файлов. См. Также ответ GreenMatt. Хотя glob возвращает только имя файла, например os.listdir, он все равно возвращает имена каталогов. Шаблон '*. *' Может быть достаточно, если у вас нет имен файлов без продолжения или точек в именах каталогов. – Steven

0
import os 
import shutil 
os.chdir('C:\\') #Make sure you add your source and destination path below 

dir_src = ("C:\\foooo\\") 
dir_dst = ("C:\\toooo\\") 

for filename in os.listdir(dir_src): 
    if filename.endswith('.txt'): 
     shutil.copy(dir_src + filename, dir_dst) 
    print(filename) 
1
def recursive_copy_files(source_path, destination_path, override=False): 
""" 
Recursive copies files from source to destination directory. 
:param source_path: source directory 
:param destination_path: destination directory 
:param override if True all files will be overridden otherwise skip if file exist 
:return: count of copied files 
""" 
files_count = 0 
if not os.path.exists(destination_path): 
    os.mkdir(destination_path) 
items = glob.glob(source_path + '/*') 
for item in items: 
    if os.path.isdir(item): 
     path = os.path.join(destination_path, item.split('/')[-1]) 
     files_count += recursive_copy_files(source_path=item, destination_path=path, override=override) 
    else: 
     file = os.path.join(destination_path, item.split('/')[-1]) 
     if not os.path.exists(file) or override: 
      shutil.copyfile(item, file) 
      files_count += 1 
return files_count 
+1

Это может помочь дать вербальное объяснение вашего кода. –

+0

. Я думаю, вы имеете в виду ** переписать **, а не ** переопределить ** –

Смежные вопросы