Risposte:
Puoi usare os.listdir () per ottenere i file nella directory sorgente, os.path.isfile () per vedere se sono file normali (inclusi collegamenti simbolici su sistemi * nix) e shutil.copy per eseguire la copia.
Il codice seguente copia solo i file regolari dalla directory di origine nella directory di destinazione (presumo che non si desideri copiare alcuna sottodirectory).
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
è il nome della directory. shutil.copy(src, dst)
"copia il file src nel file o nella directory dst .... Se dst specifica una directory, il file verrà copiato in dst utilizzando il nome file di base di src."
Se non si desidera copiare l'intero albero (con sottodirectory, ecc.), Utilizzare o glob.glob("path/to/dir/*.*")
per ottenere un elenco di tutti i nomi di file, scorrere l'elenco e utilizzare shutil.copy
per copiare ciascun file.
for filename in glob.glob(os.path.join(source_dir, '*.*')):
shutil.copy(filename, dest_dir)
Guarda shutil nella documentazione di Python , in particolare il 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)
Ecco un altro esempio di una funzione di copia ricorsiva che consente di copiare il contenuto della directory (comprese le sottodirectory) un file alla volta, che ho usato per risolvere questo 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 puoi, usa sicuramente shutil.copytree(src, dest)
. Ciò richiede che la cartella di destinazione non esista già. Se devi copiare file in una cartella esistente, il metodo sopra funziona bene!