如果文件不存在,请复制文件
这个问题在这里已经有了答案:
在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