Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果文件不存在,则复制它';不存在_Python_File_File Io - Fatal编程技术网

Python 如果文件不存在,则复制它';不存在

Python 如果文件不存在,则复制它';不存在,python,file,file-io,Python,File,File Io,我对python相当陌生,我想知道如何通过首先检查复制的文件是否存在于目标文件夹中,将文件从一个位置复制并粘贴到另一个位置 我之所以要检查文件是否存在,是因为此脚本将放在任务计划程序上,并按设置的计划运行,所以我不想每次都复制所有内容,只复制目标文件夹中不存在的文件 提前谢谢 import glob import os.path import shutil SRC_DIR = #your source directory TARG_DIR = #your target directory G

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

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

提前谢谢

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的文件,等等。将其调整到您想要的位置应该不会太难

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

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


编辑:显然glob的工作方式与我记忆中的不同,对此表示抱歉。

在Python中,通常可以看到,在运行代码时,您会遇到错误,称为
异常。因此,部署了
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
系统是一种非常好的处理事情的方式
try/catch
非常简单且受欢迎,但您的情况可能需要一些不同的东西


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

os.path.exists(/some/path/)
FWIW,我认为处理文件创建/删除/使用的方法几乎总是比
os.path.exists
更好。在大多数情况下,有另一个模块可以更优雅地处理它(正如我在回答中使用glob比较两个列表时所用的),如果没有,那么try/catch在防止竞争条件方面做得更好。我想不出我写过的任何使用
os.path.exists
的脚本,我无法重新编写以使用功能更好的
glob
。@adsmith除非您有一些安全问题,否则没有理由不使用
os.path.exist
使用rsync而不是cpi在这种情况下,我不想复制整个文件夹,我想复制文件夹中的内容,PDF文件。这就是它的作用——对不起,我不清楚
glob.glob
根据您给定的一些参数返回文件夹内容列表(
glob.glob(target\u DIR+“\\*.pdf”)
将返回target\u DIR中的文件列表,例如扩展名为pdf)。以下是我尝试过的内容,并且出现了一个错误:
import glob import os.path import shutil SRC\u DIR=glob.glob(SRC_DIR)中文件的“C:\\Users\\mboyle\\Documents\\Source”Target=“C:\\Users\\mboyle\\Documents\\Target”:如果文件不在glob.glob(Target_DIR)中,则为shutil.copy(file,Target DIR)否则:打印“exists”
第10行,即
shutil.copy(file,Target DIR)
。是否需要指定文件类型(.pdf)不可以。你能帮我粘贴堆栈跟踪吗?在大多数Python项目中,函数和变量名中的大写字母被认为是不好的样式: