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

我正在尝试在 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


手掌心
浏览 230回答 3
3回答

慕尼黑8549860

如果文件已经存在,我们要创建一个新文件而不是覆盖它。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])检查目的地是否存在。如果是,请创建一个新目标并移动文件。

翻阅古今

在最后一个 for 循环中移动它之前,您可以检查文件是否已经存在,并取决于移动它的结果。我做了一个递归函数来检查文件名并递增它直到文件名是新的:import osdef 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 pathfor filename in filelistsrc:    if os.path.exists(filename):        renamefile(filename)    shutil.move(filename, dictfiles[filename])

喵喵时光机

这是另一个解决方案,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))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python