Cómo copiar todos los archivos presentes en un directorio a otro directorio usando Python. Tengo la ruta de origen y la ruta de destino como cadena.
Respuestas:
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)
dest
es 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".
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.copy
para copiar cada archivo.
for filename in glob.glob(os.path.join(source_dir, '*.*')):
shutil.copy(filename, dest_dir)
Mire shutil en los documentos de Python , específicamente el comando copytree .
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)
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!