2015-12-05 3 views
2

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)

enter image description here

+0

Il suffit de les copier 1 par 1 avec shutil.copyfile() – Muposat

+0

BTW, votre terminologie est un peu confus: on copie normalement _from_ la source _sur la cible (ou de destination). –

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