Copie varios archivos en Python

Respuestas:

139

Puede usar os.listdir () para obtener los archivos en el directorio de origen, os.path.isfile () para ver si son archivos normales (incluidos los enlaces simbólicos en los sistemas * nix) y shutil.copy para hacer la copia.

El siguiente código copia solo los archivos normales del directorio de origen al directorio de destino (supongo que no desea que se copien los subdirectorios).

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
fuente
¿Dest debería ser algo como C: \ myfolder o C: \ myfolder \ filename.ext?
Steve Byrne
4
@StevenByrne Puede ser cualquiera, dependiendo de si también desea cambiar el nombre del archivo. Si no es así, entonces destes el nombre del directorio. shutil.copy(src, dst)"copia el archivo src al archivo o directorio dst .... Si dst especifica un directorio, el archivo se copiará en dst usando el nombre de archivo base de src".
30

Si no desea copiar todo el árbol (con subdirectorios, etc.), use o glob.glob("path/to/dir/*.*")para obtener una lista de todos los nombres de archivo, recorra la lista y use shutil.copypara copiar cada archivo.

for filename in glob.glob(os.path.join(source_dir, '*.*')):
    shutil.copy(filename, dest_dir)
Steven
fuente
2
Nota: Es posible que deba verificar los resultados globales con os.path.isfile () para asegurarse de que sean nombres de archivo. Vea también la respuesta de GreenMatt. Si bien glob devuelve solo el nombre de archivo como os.listdir, también devuelve nombres de directorio. El ' . 'puede ser suficiente, siempre que no tenga nombres de archivo sin extensión o puntos en los nombres de directorio.
Steven
Esto no copia subdirecciones
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
Константин Бушко
fuente
1
Podría ayudar dar una explicación verbal de su código
calico_
1
Creo que te refieres a sobrescribir , no anular
Mohammad ElNesr
Konstantin gran respuesta !! me ayudo mucho. Sin embargo, una sugerencia: usar os.sep en lugar de '/' (por lo que funciona en sistemas operativos que no son 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
fuente
3

Aquí hay otro ejemplo de una función de copia recursiva que le permite copiar el contenido del directorio (incluidos los subdirectorios) un archivo a la vez, que utilicé 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)

EDITAR: Si puede, definitivamente solo use shutil.copytree(src, dest). Sin embargo, esto requiere que esa carpeta de destino aún no exista. Si necesita copiar archivos en una carpeta existente, ¡el método anterior funciona bien!

Dustin Michels
fuente