Вы можете использовать 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)
Должно быть что-то вроде C: \ myfolder или C: \ myfolder \ filename.ext?
Стив Бирн,
4
@StevenByrne Может быть любым, в зависимости от того, хотите ли вы также переименовать файл. Если нет, то destэто имя каталога. shutil.copy(src, dst)"копирует файл src в файл или каталог dst .... Если dst указывает каталог, файл будет скопирован в dst с использованием базового имени файла из src."
Небольшое улучшение: оставьте src_files и сделайтеfor fn in os.listdir(src)
Тимо
32
Если вы не хотите копировать все дерево (с подкаталогами и т. Д.), Используйте или, glob.glob("path/to/dir/*.*")чтобы получить список всех имен файлов, переберите список и используйте shutil.copyдля копирования каждого файла.
for filename in glob.glob(os.path.join(source_dir, '*.*')):
shutil.copy(filename, dest_dir)
Примечание. Возможно, вам придется проверить результаты glob с помощью os.path.isfile (), чтобы убедиться, что это имена файлов. См. Также ответ GreenMatt. Хотя glob возвращает только имя файла, например os.listdir, он также возвращает имена каталогов. Файл ' . 'может быть достаточно, если у вас нет файлов без расширений или точек в именах каталогов.
Это может помочь дать устное объяснение вашего кода
calico_
1
Я думаю, вы имеете в виду перезаписать , а не переопределить
Мохаммад Эль-Неср
Константин отличный ответ !! мне очень помогли. Одно предложение: использовать os.sep вместо '/' (чтобы он работал на ОС, отличных от Linux)
Ари
4
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)
Вот еще один пример функции рекурсивного копирования, которая позволяет копировать содержимое каталога (включая подкаталоги) по одному файлу за раз, который я использовал для решения этой проблемы.
import os
import shutil
defrecursive_copy(src, dest):"""
Copy each file from src dir to dest dir, including sub-directories.
"""for item in os.listdir(src):
file_path = os.path.join(src, item)
# if item is a file, copy itif os.path.isfile(file_path):
shutil.copy(file_path, dest)
# else if item is a folder, recurse elif os.path.isdir(file_path):
new_dest = os.path.join(dest, item)
os.mkdir(new_dest)
recursive_copy(file_path, new_dest)
РЕДАКТИРОВАТЬ: Если можете, определенно просто используйте shutil.copytree(src, dest). Однако для этого требуется, чтобы папка назначения еще не существовала. Если вам нужно скопировать файлы в существующую папку, описанный выше метод подойдет!
Ответы:
Вы можете использовать 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)
источник
dest
это имя каталога.shutil.copy(src, dst)
"копирует файл src в файл или каталог dst .... Если dst указывает каталог, файл будет скопирован в dst с использованием базового имени файла из src."for fn in os.listdir(src)
Если вы не хотите копировать все дерево (с подкаталогами и т. Д.), Используйте или,
glob.glob("path/to/dir/*.*")
чтобы получить список всех имен файлов, переберите список и используйтеshutil.copy
для копирования каждого файла.for filename in glob.glob(os.path.join(source_dir, '*.*')): shutil.copy(filename, dest_dir)
источник
Посмотрите на shutil в документации Python , особенно на команду copytree .
Если целевой каталог уже существует, попробуйте:
shutil.copytree(source, destination, dirs_exist_ok=True)
источник
dirs_exist_ok=True
вариант.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
источник
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)
источник
Вот еще один пример функции рекурсивного копирования, которая позволяет копировать содержимое каталога (включая подкаталоги) по одному файлу за раз, который я использовал для решения этой проблемы.
import os import shutil def recursive_copy(src, dest): """ Copy each file from src dir to dest dir, including sub-directories. """ for item in os.listdir(src): file_path = os.path.join(src, item) # if item is a file, copy it if os.path.isfile(file_path): shutil.copy(file_path, dest) # else if item is a folder, recurse elif os.path.isdir(file_path): new_dest = os.path.join(dest, item) os.mkdir(new_dest) recursive_copy(file_path, new_dest)
РЕДАКТИРОВАТЬ: Если можете, определенно просто используйте
shutil.copytree(src, dest)
. Однако для этого требуется, чтобы папка назначения еще не существовала. Если вам нужно скопировать файлы в существующую папку, описанный выше метод подойдет!источник