Copier plusieurs fichiers en Python

Réponses:

139

Vous pouvez utiliser os.listdir () pour obtenir les fichiers dans le répertoire source, os.path.isfile () pour voir s'il s'agit de fichiers normaux (y compris des liens symboliques sur les systèmes * nix) et shutil.copy pour effectuer la copie.

Le code suivant copie uniquement les fichiers normaux du répertoire source dans le répertoire de destination (je suppose que vous ne voulez pas copier de sous-répertoires).

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
la source
Dest devrait-il être quelque chose comme C: \ mon dossier ou C: \ mon dossier \ nomfichier.ext?
Steve Byrne
4
@StevenByrne Peut être l'un ou l'autre, selon que vous souhaitez également renommer le fichier. Sinon, alors destest le nom du répertoire. shutil.copy(src, dst)"copie le fichier src dans le fichier ou répertoire dst .... Si dst spécifie un répertoire, le fichier sera copié dans dst en utilisant le nom de fichier de base de src."
30

Si vous ne voulez pas copier l'arborescence entière (avec les sous-répertoires, etc.), utilisez ou glob.glob("path/to/dir/*.*")pour obtenir une liste de tous les noms de fichiers, parcourez la liste et utilisez shutil.copypour copier chaque fichier.

for filename in glob.glob(os.path.join(source_dir, '*.*')):
    shutil.copy(filename, dest_dir)
Steven
la source
2
Remarque: vous devrez peut-être vérifier les résultats globaux avec os.path.isfile () pour vous assurer qu'il s'agit de noms de fichiers. Voir aussi la réponse de GreenMatt. Bien que glob ne renvoie que le nom de fichier comme os.listdir, il renvoie toujours les noms de répertoires également. Le ' . 'peut suffire, tant que vous n'avez pas de noms de fichiers sans extension ou de points dans les noms de répertoire.
Steven
Cela ne copie pas les sous
répertoires
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
Константин Бушко
la source
1
Il pourrait être utile de donner une explication verbale de votre code
calico_
1
Je pense que vous voulez dire écraser , pas remplacer
Mohammad ElNesr
Bonne réponse Konstantin !! m'a beaucoup aidé. Une suggestion cependant: utiliser os.sep au lieu de '/' (cela fonctionne donc sur un système d'exploitation 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)
Isaac Ewhuiknebueze
la source
3

Voici un autre exemple de fonction de copie récursive qui vous permet de copier le contenu du répertoire (y compris les sous-répertoires) un fichier à la fois, que j'ai utilisé pour résoudre ce problème.

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: Si vous le pouvez, utilisez certainement shutil.copytree(src, dest). Cela nécessite cependant que ce dossier de destination n'existe pas déjà. Si vous devez copier des fichiers dans un dossier existant, la méthode ci-dessus fonctionne bien!

Dustin Michels
la source