为了账号安全,请及时绑定邮箱和手机立即绑定

移动文件但重命名(如果存在于 python 中)

移动文件但重命名(如果存在于 python 中)

手掌心 2023-05-09 10:03:19
我正在尝试在 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
查看完整描述

3 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

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


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])

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


查看完整回答
反对 回复 2023-05-09
?
翻阅古今

TA贡献1780条经验 获得超5个赞

在最后一个 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])


查看完整回答
反对 回复 2023-05-09
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

这是另一个解决方案,


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))


查看完整回答
反对 回复 2023-05-09
  • 3 回答
  • 0 关注
  • 228 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号