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
需要注意的是,文件复制通常涉及竞争条件。基本上,从检查文件是否不在target目录(if file not in glob.glob(TARG_DIR))到实际将其复制到target目录(shutil.copy(file,TARG_DIR))之间需要一段时间。在这段时间内,文件可能会在那里结束,这将导致shutil.copy覆盖文件。这可能不是您想要的功能,在这种情况下,您应该研究不同的方法。我不知道一个好的没有一些研究,将试图复制一个文件,但返回一个例外,如果该文件已经存在。
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
我假设您试图用这个命令发送整个文件夹,否则
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
。下面是我在日常工作中使用的一段代码,它可以从目录中清除文件,如果文件不存在,则跳过这些文件。
这是检查文件是否存在的经典示例。与其在
try
语句中删除,不如尝试复制文件。如果它失败了,它将转到pass
,这将跳过try/catch
块。注意,
try/catch
可以用来捕获任何异常,也可以用来捕获specific ones。我已经写了OSError
但请仔细阅读以确保这是您想要的。如果您在一个catch
中有一个特定的错误,并且系统返回了一个错误类型,那么您的try/catch
将无法按您希望的方式工作。所以,一定要。最好是一般性的。快乐编码!
编辑:值得注意的是,这个
try/catch
系统是一个非常的Pythonic方式。try/catch
是非常简单和流行的,但是您的情况可能需要一些不同的东西。编辑:我不确定这是否值得注意,但我知道我的回答并没有直接告诉您如何检查文件是否存在。相反,它假定它不这样做,并继续进行操作。如果你遇到了一个问题(即,它存在,你需要覆盖),你可以使它自动跳过整个问题,进入下一个问题。同样,这只是完成相同任务的许多方法之一。
相关问题 更多 >
编程相关推荐