如果文件不存在,请复制文件

这个问题在这里已经有了答案:

  • 如何检查文件是否存在? 39个答案

  • 在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可用于捕获任何异常,或者可用于捕获特定的异常。 我有OSError潦草写入,但通读它们以确保这是你想要的。 如果您在catch发现了特定的错误,并且系统返回错误类型,则您的try/catch将无法按照您希望的方式工作。 所以,可以肯定。 在最好的情况下,一般。

    快乐的编码!

    编辑:值得注意的是,这个try/catch系统是一种非常Pythonic的方式来处理事情。 try/catch是非常容易和流行的,但是你的情况可能需要不同的东西。

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


    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(file,TARG_DIR) 。 在这段时间内,文件可能会在那里结束,这将导致shutil.copy覆盖文件。 这可能不是你想要的功能,在这种情况下,你应该看看不同的方法。 如果没有一些研究将会尝试复制一个文件,但是如果该文件已经存在,则会返回一个异常。

    尝试/除了块,作为提到的另一个答案,在这里也可能有用,如果可能的话,当脚本运行时,您将无法对目录进行写入访问。 如果是这种情况, shutil.copy将返回一个IOError异常。 我相信如果您没有对源目录的读取访问权限(这反过来不会通过“For”循环提供任何内容,所以您不会在那里发生任何错误),glob将仅返回一个空列表。

    编辑:显然glob不工作,我记得它的方式,对此感到遗憾。

    链接地址: http://www.djcxy.com/p/7301.html

    上一篇: Copy file if it doesn't already exist

    下一篇: Python if statement error handling