Copia più file in Python


Risposte:


138

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 dovrebbe essere qualcosa come C: \ myfolder o C: \ myfolder \ filename.ext?
Steve Byrne

4
@StevenByrne Può essere l'uno o l'altro, a seconda che tu voglia rinominare anche il file. In caso contrario, 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."

30

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.copyper copiare ciascun file.

for filename in glob.glob(os.path.join(source_dir, '*.*')):
    shutil.copy(filename, dest_dir)

2
Nota: potresti dover controllare i risultati di glob con os.path.isfile () per assicurarti che siano nomi di file. Vedi anche la risposta di GreenMatt. Sebbene glob restituisca solo il nome del file come os.listdir, restituisce comunque anche i nomi delle directory. Il ' . 'pattern potrebbe essere sufficiente, a patto che non si abbiano nomi di file senza estensione o punti nei nomi di directory.
Steven

Questo non copia le sottocartelle
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

1
Potrebbe aiutare a dare una spiegazione verbale del tuo codice
calico_

1
Penso che tu intenda sovrascrivere , non sovrascrivere
Mohammad ElNesr

Ottima risposta di Konstantin !! mi ha aiutato molto. Un suggerimento però: usare os.sep invece di '/' (quindi funziona su SO non 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)

2

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!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.