Python将文件复制到新目录,如果文件名已存在,则重命名 [英] Python copy files to a new directory and rename if file name already exists

查看:979
本文介绍了Python将文件复制到新目录,如果文件名已存在,则重命名的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经阅读了此线程,但是当我将其实现到我的代码中时,它仅适用于几次迭代。

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

我正在使用python遍历目录(称为移动目录),主要将pdf文件(匹配唯一ID)复制到另一个目录(基本目录)到匹配的文件夹(具有相应的唯一ID)。我开始使用 shutil.copy ,但是如果重复,它将覆盖现有文件。

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.

例如


  • 将文件1234.pdf复制到基本目录1234中的文件夹中。

  • 如果存在1234.pdf以将其命名为1234_1.pdf,

  • 如果将另一个pdf复制为1234.pdf,则其为1234_2.pdf 。

这是我的代码:

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"


推荐答案

有时候重新开始会更容易...我很抱歉,如果有任何错别字,我还没有时间对其进行彻底的测试。

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

这篇关于Python将文件复制到新目录,如果文件名已存在,则重命名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆