Скопируйте несколько файлов в Python


Ответы:


140

Вы можете использовать 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)

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

Это не копирует
поддиры

13

Посмотрите на shutil в документации Python , особенно на команду copytree .

Если целевой каталог уже существует, попробуйте:

shutil.copytree(source, destination, dirs_exist_ok=True)

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

@Sven Для этого попробуйте dirs_exist_ok=Trueвариант.
Emadpres

5
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
Это может помочь дать устное объяснение вашего кода
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)

3

Вот еще один пример функции рекурсивного копирования, которая позволяет копировать содержимое каталога (включая подкаталоги) по одному файлу за раз, который я использовал для решения этой проблемы.

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). Однако для этого требуется, чтобы папка назначения еще не существовала. Если вам нужно скопировать файлы в существующую папку, описанный выше метод подойдет!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.