web-dev-qa-db-fra.com

Copier plusieurs fichiers dans Python

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

76
hidayat

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

Le code suivant ne copie que 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)
116
GreenMatt

Si vous ne voulez pas copier tout l’arbre (avec les sous-répertoires, etc.), utilisez ou glob.glob("path/to/dir/*.*") pour obtenir la liste de tous les noms de fichiers, passez en boucle 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)
26
Steven

Regardez fermez la Python docs , plus précisément la commande copytree .

10
Doon
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)
4
Isaac
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

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) fichier par fichier, ce qui m'a permis de 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 simplement 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!

1
Dustin Michels