如果文件尚未退出,则复制该文件

2024-04-25 03:31:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python还不太熟悉,我想知道如何在第一次检查目标文件夹中是否存在复制的文件时,将文件从一个位置复制并粘贴到另一个位置?

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

提前谢谢!


Tags: 文件程序脚本文件夹内容目标粘贴原因
2条回答
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

我假设您试图用这个命令发送整个文件夹,否则glob使用非常容易理解的接口。glob.glob("*.txt")将获取所有扩展名为.txt的文件,等等。将其调整为您所需要的文件并不太难。

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

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

编辑:显然glob并不像我记忆中那样工作,很抱歉。

在Python中,经常可以看到在运行代码时会遇到错误,称为exceptions。因此,已部署try/catch

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

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可以用来捕获任何异常,也可以用来捕获specific ones。我已经写了OSError但请仔细阅读以确保这是您想要的。如果您在一个catch中有一个特定的错误,并且系统返回了一个错误类型,那么您的try/catch将无法按您希望的方式工作。所以,一定要。最好是一般性的。

快乐编码!

编辑:值得注意的是,这个try/catch系统是一个非常的Pythonic方式。try/catch是非常简单和流行的,但是您的情况可能需要一些不同的东西。

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

相关问题 更多 >