Je voulais automatiser le processus de copie des fichiers (dans leurs dossiers cibles) vers leurs dossiers sources correspondants (qui a le même la structure du dossier comme la source) situé dans un répertoire différent sur l'ordinateur ...
J'ai essayé d'utiliser shutil.copytree de python, mais cela va copier tous les dossiers cibles dans les dossiers source et la documentation Python a déclaré que "Le répertoire de destination, nommé par dst, ne doit pas déjà exister "(qui, dans mon cas, enfreint la règle). Donc ce que je voulais faire est de copier uniquement les fichiers cibles dans le dossier correspondant, de sorte que les fichiers source et cible finiraient par rester dans le même dossier ... Est-il possible de faire en utilisant python?
Ici, j'ai joint à la question une capture d'écran pour expliquer ce que je voulais dire.
Merci beaucoup pour votre aide! En attendant, je vais essayer de faire plus de recherches à ce sujet aussi!Utilisez Python pour automatiser la copie de fichiers dans leurs dossiers cibles correspondants (shutil.copytree ne fonctionne pas comme prévu)
2
A
Répondre
2
est ici la version modifiée de shutil.copytree
qui ne crée pas le répertoire (supprimé os.makedirs
appel).
import os
from shutil import Error, WindowsError, copy2, copystat
def copytree(src, dst, symlinks=False, ignore=None):
names = os.listdir(src)
if ignore is not None:
ignored_names = ignore(src, names)
else:
ignored_names = set()
# os.makedirs(dst)
errors = []
for name in names:
if name in ignored_names:
continue
srcname = os.path.join(src, name)
dstname = os.path.join(dst, name)
try:
if symlinks and os.path.islink(srcname):
linkto = os.readlink(srcname)
os.symlink(linkto, dstname)
elif os.path.isdir(srcname):
copytree(srcname, dstname, symlinks, ignore)
else:
# Will raise a SpecialFileError for unsupported file types
copy2(srcname, dstname)
# catch the Error from the recursive copytree so that we can
# continue with other files
except Error, err:
errors.extend(err.args[0])
except EnvironmentError, why:
errors.append((srcname, dstname, str(why)))
try:
copystat(src, dst)
except OSError, why:
if WindowsError is not None and isinstance(why, WindowsError):
# Copying file access times may fail on Windows
pass
else:
errors.append((src, dst, str(why)))
if errors:
raise Error, errors
En utilisant mock
(ou unittest.mock
3.x Python), vous pouvez désactiver temporairement os.makedirs
en remplaçant os.makedirs
avec un objet Mock (Voir unittest.mock.patch
):
from shutil import copytree
import mock # import unittest.mock as mock in Python 3.x
with mock.patch('os.makedirs'):
copytree('PlaceB', 'PlaceA')
0
Je viens de trouver un moyen assez facile pour y arriver.
Nous pouvons utiliser la commande ditto pour fusionner les deux dossiers ensemble.
ditto PlaceB PlaceA
Il suffit de les copier 1 par 1 avec shutil.copyfile() – Muposat
BTW, votre terminologie est un peu confus: on copie normalement _from_ la source _sur la cible (ou de destination). –