Copie vários arquivos em Python

Respostas:

138

Você pode usar os.listdir () para obter os arquivos no diretório de origem, os.path.isfile () para ver se eles são arquivos regulares (incluindo links simbólicos em sistemas * nix) e shutil.copy para fazer a cópia.

O código a seguir copia apenas os arquivos regulares do diretório de origem para o diretório de destino (presumo que você não queira que nenhum subdiretório seja copiado).

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)
GreenMatt
fonte
Dest deve ser algo como C: \ myfolder ou C: \ myfolder \ filename.ext?
Steve Byrne
4
@StevenByrne Pode ser qualquer um, dependendo se você também deseja renomear o arquivo. Caso contrário, desté o nome do diretório. shutil.copy(src, dst)"copia o arquivo src para o arquivo ou diretório dst .... Se dst especificar um diretório, o arquivo será copiado para dst usando o nome de arquivo base de src."
30

Se você não quiser copiar a árvore inteira (com subdiretórios, etc.), use ou glob.glob("path/to/dir/*.*")para obter uma lista de todos os nomes de arquivos, faça um loop na lista e use shutil.copypara copiar cada arquivo.

for filename in glob.glob(os.path.join(source_dir, '*.*')):
    shutil.copy(filename, dest_dir)
Steven
fonte
2
Nota: Você pode ter que verificar os resultados glob com os.path.isfile () para ter certeza de que são nomes de arquivos. Veja também a resposta da GreenMatt. Embora glob retorne apenas o nome do arquivo como os.listdir, ele ainda retorna nomes de diretório também. O ' . 'padrão pode ser suficiente, desde que você não tenha nomes de arquivos sem extensão ou pontos nos nomes de diretório.
Steven
Isso não copia subdiretórios
citynorman
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
Константин Бушко
fonte
1
Pode ser
útil
1
Acho que você quer dizer substituir , não substituir
Mohammad ElNesr de
Ótima resposta de Konstantin !! me ajudou muito. Uma sugestão: usar os.sep em vez de '/' (para funcionar em sistemas operacionais não-linux)
Ari
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)
Isaac Ewhuiknebueze
fonte
2

Aqui está outro exemplo de função de cópia recursiva que permite copiar o conteúdo do diretório (incluindo subdiretórios) um arquivo por vez, que usei para resolver este problema.

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)

EDIT: Se você puder, definitivamente use shutil.copytree(src, dest). Isso requer que essa pasta de destino ainda não exista. Se você precisar copiar arquivos para uma pasta existente, o método acima funciona bem!

Dustin Michels
fonte