【问题标题】:Move file but rename if existing in python移动文件,但如果存在于 python 中则重命名
【发布时间】:2020-08-09 06:44:00
【问题描述】:

我正在尝试在 Windows 中移动我的文件。目前这些文件位于驱动器 C: 下的文件夹中,但我想将它们移动到 D: 中的某个位置。

我正在使用 shutil.move 函数,但如果文件存在,该函数会覆盖该文件。我想在目标中保留文件的副本而不是覆盖它。有这样的功能吗?

def movefiles(strsrc, strdest, strextension):
    filelistsrc = []  #source files full path
    # store the destination of the current file
    dictfiles = {}

    for f in os.listdir(strsrc):
        if os.path.isfile(os.path.join(strsrc, f)):
            filefullname = os.path.join(strsrc, f)
            if filefullname.endswith(".html"):
                filelistsrc.append(filefullname)
                dictfiles[filefullname] = os.path.join(strdest, f)

    if not filelistsrc:
        return -1

    print("Start moving files from:")
    printstrlist(filelistsrc)

    for filename in filelistsrc:
        shutil.move(filename, dictfiles[filename])

    return 0

【问题讨论】:

  • 你能发布你的代码吗?
  • 我已将其添加到帖子中。

标签: python python-3.x


【解决方案1】:

这是另一种解决方案,

def move_files(str_src, str_dest):
    for f in os.listdir(str_src):
        if os.path.isfile(os.path.join(str_src, f)):
            # if not .html continue..
            if not f.endswith(".html"):
                continue

            # count file in the dest folder with same name..
            count = sum(1 for dst_f in os.listdir(str_dest) if dst_f == f)
            
            # prefix file count if duplicate file exists in dest folder
            if count:
                dst_file = f + "_" + str(count + 1)
            else:
                dst_file = f

            shutil.move(os.path.join(str_src, f),
                        os.path.join(str_dest, dst_file))

【讨论】:

    【解决方案2】:

    在最后一个 for 循环中移动它之前,您可以检查文件是否已经存在并取决于移动它的结果。我做了一个递归函数来检查文件名并递增它直到文件名是新的:

    import os
    
    def renamefile(ffpath, idx = 1):
        
        #Rename the file from test.jpeg to test1.jpeg
        path, ext = os.path.splitext(ffpath)
        path, filename = path.split('/')[:-1], path.split('/')[-1]
        new_filename = filename + str(idx)
        path.append(new_filename + ext)
        path = ('/').join(path)
    
        #Check if the file exists. if not return the filename, if it exists increment the name with 1    
        if os.path.exists(path):
            print("Filename {} already exists".format(path))
            return renamefile(ffpath, idx = idx+1)
        
        return path
    
    for filename in filelistsrc:
        if os.path.exists(filename):
            renamefile(filename)
    
        shutil.move(filename, dictfiles[filename])
    

    【讨论】:

    • 我只想像 windows 一样自动重命名它。例如:example.txt可以重命名为example2.txt
    【解决方案3】:

    如果文件已经存在,我们要创建一个新文件,而不是覆盖它。

    for filname in filelistsrc:
        if os.path.exists(dictfiles[filename]):
            i, temp = 1, filename
            file_name, ext = filename.split("/")[-1].split(".")
            while os.path.exists(temp):
                temp = os.path.join(strdest, f"{file_name}_{i}.{ext}")
                dictfiles[filename] = temp
                i += 1
        shutil.move(filename, dictfiles[filename])
    

    检查目的地是否存在。如果是,请创建一个新目标并移动文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      相关资源
      最近更新 更多