复制文件(如果尚不存在)

mpb*_*yle 5 python file-io file

我是python的新手,我想知道如何通过首先检查复制的文件是否存在于目标文件夹中来将文件从一个位置复制和粘贴到另一个位置?

我要检查文件是否存在的原因是,此脚本将放在任务计划程序中并按设定的时间表运行,所以我不想每次都复制所有文件,而只是复制其中不存在的文件目标文件夹?

提前致谢!

Ada*_*ith 7

import glob
import os.path
import shutil

SRC_DIR = #your source directory
TARG_DIR = #your target directory

GLOB_PARMS = "*" #maybe "*.pdf" ?

for file in glob.glob(os.path.join(SRC_DIR, GLOB_PARMS)):
    if file not in glob.glob(os.path.join(TARG_DIR, GLOB_PARMS)):
        shutil.copy(file,TARG_DIR)
    else:
        print("{} exists in {}".format(
            file,os.path.join(os.path.split(TARG_DIR)[-2:])))
        # This is just a print command that outputs to console that the
        # file was already in directory
Run Code Online (Sandbox Code Playgroud)

我假设您正在尝试使用此命令发送整个文件夹,否则glob使用非常易于理解的界面。glob.glob("*.txt")将抓取所有带有 .txt 扩展名的文件等。将其调整为您想要的应该不会太难。

重要的是要注意文件复制通常涉及竞争条件。基本上,在检查文件是否不在 TARG_DIR ( if file not in glob.glob(TARG_DIR)) 和实际将其复制到那里 ( shutil.copy(file,TARG_DIR)) 之间需要时间。在这段时间内,文件可能会在那里结束,这将导致shutil.copy覆盖文件。这可能不是您想要的功能,在这种情况下,您应该寻找不同的方法。如果没有一些研究,我不知道有什么好的方法会尝试复制文件,但如果该文件已经存在则返回异常。

Try/Except 块,正如提到的另一个答案,如果您在脚本运行时可能没有对目录的写访问权限,那么这里也可能很有用。如果是这种情况,shutil.copy将返回IOError异常。我相信,如果您没有对源目录的读取访问权限,glob 只会返回一个空列表(这反过来不会通过“For”循环提供任何内容,因此您不会在那里出现任何错误)。

编辑:显然 glob 不像我记得的那样工作,对此感到抱歉。