75 votes

Python - Déplacer et écraser des fichiers et des dossiers

J'ai un répertoire, 'Dst Directory', qui contient des fichiers et des dossiers et j'ai 'src Directory' qui contient également des fichiers et des dossiers. Ce que je veux faire, c'est déplacer le contenu de 'src Directory' vers 'Dst Directory' et écraser tous les fichiers qui existent avec le même nom. Ainsi, par exemple, "Répertoire src \file.txt doit être déplacé vers 'Dst Directory' et écraser le fichier .txt existant. Il en va de même pour certains dossiers, en déplaçant un dossier et en fusionnant son contenu avec le même dossier dans 'dst directory'.

J'utilise actuellement shutil.move pour déplacer le contenu de src vers dst mais il ne le fera pas si les fichiers existent déjà et il ne fusionnera pas les dossiers ; il mettra juste le dossier à l'intérieur du dossier existant.

Mise à jour : Pour rendre les choses un peu plus claires, ce que je fais, c'est dézipper une archive dans le répertoire Dst, puis y déplacer le contenu du répertoire Src et la réimprimer, ce qui a pour effet de mettre à jour les fichiers de l'archive zip. Ceci sera répété pour l'ajout de nouveaux fichiers ou de nouvelles versions de fichiers, etc, c'est pourquoi il faut écraser et fusionner.

Résolu : J'ai résolu mon problème en utilisant distutils.dir_util.copy_tree(src, dst), ceci copie les dossiers et fichiers du répertoire src vers le répertoire dst et écrase/fusionne là où c'est nécessaire. J'espère que cela aidera certaines personnes !

J'espère que cela a du sens, Merci.

0 votes

Notez que distutils.dir_util.copy_tree n'est pas en mesure de copier les fichiers spéciaux, par ex. tuyaux nommés (lancers distutils.errors.DistutilsFileError ).

1voto

phimuemue Points 11644

Jetez un coup d'oeil : os.remove pour supprimer les fichiers existants.

0 votes

Le problème, c'est que les fichiers que je veux ajouter au dossier vont changer (de nouveaux seront ajoutés et les anciens seront mis à jour), je ne peux donc pas avoir une liste fixe de ce qu'il faut supprimer.

1voto

the Points 115

J'ai eu un problème similaire. Je voulais déplacer des fichiers et des structures de dossiers et écraser des fichiers existants, mais ne rien supprimer de ce qui se trouve dans la structure du dossier de destination.

Je l'ai résolu en utilisant os.walk() en appelant récursivement ma fonction et en utilisant shutil.move() sur les fichiers que je voulais écraser et les dossiers qui n'existaient pas.

Cela fonctionne comme suit shutil.move() mais avec l'avantage que les fichiers existants sont seulement écrasés, mais pas supprimés.

import os
import shutil

def moverecursively(source_folder, destination_folder):
    basename = os.path.basename(source_folder)
    dest_dir = os.path.join(destination_folder, basename)
    if not os.path.exists(dest_dir):
        shutil.move(source_folder, destination_folder)
    else:
        dst_path = os.path.join(destination_folder, basename)
        for root, dirs, files in os.walk(source_folder):
            for item in files:
                src_path = os.path.join(root, item)
                if os.path.exists(dst_file):
                    os.remove(dst_file)
                shutil.move(src_path, dst_path)
            for item in dirs:
                src_path = os.path.join(root, item)
                moverecursively(src_path, dst_path)

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