web-dev-qa-db-fra.com

Python copier les fichiers dans un nouveau répertoire et renommer si le nom du fichier existe déjà

J'ai déjà lu ce fil mais quand je l'implémente dans mon code cela ne fonctionne que pour quelques itérations.

J'utilise python pour parcourir un répertoire (permet de l'appeler déplacer le répertoire) pour copier principalement les fichiers pdf (correspondant à un ID unique) dans un autre répertoire (répertoire de base) dans le dossier correspondant (avec l'ID unique correspondant). J'ai commencé à utiliser shutil.copy mais s'il y a des doublons, il écrase le fichier existant.

J'aimerais pouvoir rechercher le dossier correspondant pour voir si le fichier existe déjà et le nommer de manière itérative si plusieurs se produisent.

par exemple.

  • copiez le fichier 1234.pdf dans le dossier du répertoire de base 1234.
  • si 1234.pdf existe pour le nommer 1234_1.pdf,
  • si un autre pdf est copié en 1234.pdf alors ce serait 1234_2.pdf.

Voici mon code:

import arcpy
import os
import re
import sys
import traceback
import collections
import shutil

movdir = r"C:\Scans"
basedir = r"C:\Links"

try:
    #Walk through all files in the directory that contains the files to copy
    for root, dirs, files in os.walk(movdir):
        for filename in files:
            #find the name location and name of files
            path = os.path.join(root, filename)
            print path
            #file name and extension
            ARN, extension = os.path.splitext(filename)
            print ARN

            #Location of the corresponding folder in the new directory
            link = os.path.join(basedir,ARN)

            # if the folder already exists in new directory
            if os.path.exists(link):

                #this is the file location in the new directory
                file = os.path.join(basedir, ARN, ARN)
                linkfn = os.path.join(basedir, ARN, filename)

                if os.path.exists(linkfn):
                    i = 0
                    #if this file already exists in the folder
                    print "Path exists already"
                    while os.path.exists(file + "_" + str(i) + extension):
                        i+=1
                    print "Already 2x exists..."
                    print "Renaming"
                    shutil.copy(path, file + "_" + str(i) + extension)
                else:

                    shutil.copy(path, link)
                    print ARN + " " +  "Copied"
            else:
                print ARN + " " + "Not Found"
28
GISKid

Parfois, il est juste plus facile de recommencer ... Je m'excuse s'il y a une faute de frappe, je n'ai pas eu le temps de la tester à fond.

movdir = r"C:\Scans"
basedir = r"C:\Links"
# Walk through all files in the directory that contains the files to copy
for root, dirs, files in os.walk(movdir):
    for filename in files:
        # I use absolute path, case you want to move several dirs.
        old_name = os.path.join( os.path.abspath(root), filename )

        # Separate base from extension
        base, extension = os.path.splitext(filename)

        # Initial new name
        new_name = os.path.join(basedir, base, filename)

        # If folder basedir/base does not exist... You don't want to create it?
        if not os.path.exists(os.path.join(basedir, base)):
            print os.path.join(basedir,base), "not found" 
            continue    # Next filename
        Elif not os.path.exists(new_name):  # folder exists, file does not
            shutil.copy(old_name, new_name)
        else:  # folder exists, file exists as well
            ii = 1
            while True:
                new_name = os.path.join(basedir,base, base + "_" + str(ii) + extension)
                if os.path.exists(newname):
                   shutil.copy(old_name, new_name)
                   print "Copied", old_name, "as", new_name
                   break 
                ii += 1
22
Jblasco

J'utilise toujours l'horodatage - il n'est donc pas possible que le fichier existe déjà:

import os
import shutil
import datetime

now = str(datetime.datetime.now())[:19]
now = now.replace(":","_")

src_dir="C:\\Users\\Asus\\Desktop\\Versand Verwaltung\\Versand.xlsx"
dst_dir="C:\\Users\\Asus\\Desktop\\Versand Verwaltung\\Versand_"+str(now)+".xlsx"
shutil.copy(src_dir,dst_dir)
13
user8924811

Je dirais que vous avez un problème d'indentation, du moins comme vous l'avez écrit ici:

while not os.path.exists(file + "_" + str(i) + extension):
   i+=1
   print "Already 2x exists..."
   print "Renaming"
   shutil.copy(path, file + "_" + str(i) + extension)

devrait être:

while os.path.exists(file + "_" + str(i) + extension):
    i+=1
print "Already 2x exists..."
print "Renaming"
shutil.copy(path, file + "_" + str(i) + extension)

Vérifiez ceci, s'il vous plaît!

2
Jblasco