python:复制文件,如果它不存在

本问题已经有最佳答案,请猛点这里访问。

我对python相当陌生,我想知道如何将一个文件从一个位置复制粘贴到另一个位置,首先检查复制的文件是否存在于目标文件夹中?

我想检查这个文件是否存在的原因是这个脚本将被放在一个任务调度程序中,并按照一个既定的时间表运行,所以我不想每次都复制所有东西,只复制目标文件夹中不存在的那些文件?

提前谢谢!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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(SRC_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

我假设您试图用这个命令发送整个文件夹,否则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的工作方式和我记忆中的不一样,对此我很抱歉。


在Python中,经常可以看到,在运行代码时,您会遇到名为exceptions的错误。因此,部署了"yanan8"号。

下面是我日常工作中使用的一段代码,它可以清除目录中的文件,或者跳过不存在的文件。

1
2
3
4
5
6
7
8
9
10
def DeleteFile(Path_):
   """Deletes saved project AND its corresponding"files" folder."""
    try: #deletes the folder
        os.remove(Path_)
    except OSError:
        pass
    try: #deletes the file, using some fancy python operations to arrive at the filename
        shutil.rmtree(os.path.join(os.path.dirname(Path_),os.path.splitext(os.path.basename(Path_))[0])+"_files", True)
    except OSError:
        pass

这是检查文件是否存在的经典示例。您可以尝试复制文件,而不是删除try语句中的内容。如果它失败了,它将继续移动到pass,它将跳过try/catch块。

注意,try/catch可以用来捕获任何异常,也可以用来捕获特定的异常。我已经潦草地写了下来,但还是通读了一遍,以确定那就是你想要的。如果您在catch中有一个特定的错误,并且系统返回了错误类型的错误,那么您的try/catch将不能按照您希望的方式工作。所以,一定。在最好的情况下,要概括。

编码快乐!

编辑:值得注意的是,这个try/catch系统是一种非常python化的处理方法。try/catch非常简单和受欢迎,但是你的情况可能需要一些不同的东西。

编辑:我不确定这是否值得注意,但我意识到我的答案并没有直接告诉您如何检查文件是否存在。相反,它假定它不执行操作,并继续执行操作。如果你遇到了一个问题(例如。,它是存在的,您需要覆盖它),您可以使它自动跳过整个内容,进入下一个。同样,这只是完成相同任务的众多方法之一。