123 votes

Copie de plusieurs fichiers en Python

Comment copier tous les fichiers présents dans un répertoire vers un autre répertoire en utilisant Python. J'ai le chemin source et le chemin destination sous forme de chaîne.

165voto

GreenMatt Points 6301

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 les liens symboliques sur les systèmes *nix), et shutil.copy pour faire la copie.

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

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)

0 votes

Dest devrait être quelque chose comme C:\myfolder o C:\myfolder\filename.ext ?

5 votes

@StevenByrne L'un ou l'autre, selon que vous souhaitez ou non renommer le fichier. Si ce n'est pas le cas, alors dest est le nom du répertoire. shutil.copy(src, dst) " copie le fichier src dans le fichier ou le 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."

1 votes

Petite amélioration : laisser les src_files et faire for fn in os.listdir(src)

38voto

Steven Points 10243

Si vous ne voulez pas copier l'arbre entier (avec les sous-répertoires, etc.), utilisez ou glob.glob("path/to/dir/*.*") pour obtenir une liste de tous les noms de fichiers, bouclez sur la liste et utilisez shutil.copy pour copier chaque fichier.

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

2 votes

Note : Vous devrez peut-être vérifier les résultats du glob avec os.path.isfile() pour être sûr qu'il s'agit bien 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 également les noms de répertoire. La méthode ' . Le motif ' peut être suffisant, tant que vous n'avez pas de noms de fichiers sans extension, ou de points dans les noms de répertoires.

0 votes

Cela ne copie pas les sous-répertoires

25voto

Doon Points 7858

Regardez shutil dans la documentation Python et plus particulièrement le copytree commandement.

Si le répertoire de destination existe déjà, essayez :

shutil.copytree(source, destination, dirs_exist_ok=True)

3 votes

Bonne remarque, mais ce n'est peut-être pas une option si le répertoire existe déjà pour une raison quelconque comme dans mon cas.

1 votes

@Sven Pour cet essai dirs_exist_ok=True option.

4 votes

À partir de Python 3.8

5voto

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 votes

Il pourrait être utile de donner une explication verbale de votre code.

1 votes

Je pense que vous voulez dire écraser pas contourner

0 votes

Konstantin : excellente réponse, qui m'a beaucoup aidé. Une suggestion cependant : utiliser os.sep au lieu de '/' (pour que cela fonctionne sur les systèmes d'exploitation non Linux).

5voto

Isaac Points 21
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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X