Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python copy files to a new directory and rename if file name already exists

I've already read this thread but when I implement it into my code it only works for a few iterations.

I'm using python to iterate through a directory (lets call it move directory) to copy mainly pdf files (matching a unique ID) to another directory (base directory) to the matching folder (with the corresponding unique ID). I started using shutil.copy but if there are duplicates it overwrites the existing file.

I'd like to be able to search the corresponding folder to see if the file already exists, and iteratively name it if more than one occurs.

e.g.

  • copy file 1234.pdf to folder in base directory 1234.
  • if 1234.pdf exists to name it 1234_1.pdf,
  • if another pdf is copied as 1234.pdf then it would be 1234_2.pdf.

Here is my 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" 
like image 293
GISHuman Avatar asked Aug 22 '13 14:08

GISHuman


People also ask

How do I copy and rename a file in Python?

We have to use shutil. copyfile(src, dst) to copy the file from source to destination. Along with the path, the name of the file with its extension should be written. src = r'C:\Users\Administrator.

How do I copy multiple files from one directory to another in Python?

copytree() method. This function moves a file and any subdirectories it contains from one directory to another. This indicates that both the source and the destination include the file. The string must contain the names of both parameters.


2 Answers

Sometimes it is just easier to start over... I apologize if there is any typo, I haven't had the time to test it thoroughly.

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 not os.path.exists(new_name):                    shutil.copy(old_name, new_name)                    print "Copied", old_name, "as", new_name                    break                  ii += 1 
like image 189
Jblasco Avatar answered Sep 21 '22 13:09

Jblasco


I always use the time-stamp - so its not possible, that the file exists already:

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) 
like image 25
user8924811 Avatar answered Sep 21 '22 13:09

user8924811