Python:如何创建目录并在必要时覆盖现有目录?
Posted
技术标签:
【中文标题】Python:如何创建目录并在必要时覆盖现有目录?【英文标题】:Python: How to create a directory and overwrite an existing one if necessary? 【发布时间】:2015-01-23 23:21:45 【问题描述】:我想创建一个新目录并删除旧目录(如果存在)。我使用以下代码:
if os.path.isdir(dir_name):
shutil.rmtree(dir_name)
os.makedirs(dir_name)
如果目录不存在,它可以工作。
如果目录确实存在并且程序正常运行,则会出错。 (WindowsError:[错误 5] 访问被拒绝:'my_directory')
但是,如果目录已经存在并且程序在调试模式下逐行执行,它也可以工作。我猜shutil.rmtree()
和makedirs()
在通话之间需要一些时间。
什么是正确的代码才不会产生错误?
【问题讨论】:
我相信您收到该错误的原因是因为您对要删除的目录没有读取权限。要授予此权限,请键入chmod +r directory_name
,您应该拥有它的权限。
@PiJoules 这并不能解释为什么它在调试时起作用。
【参考方案1】:
在 Python 中,一条语句在前一条语句完成后才执行,这就是解释器的工作方式。
我的猜测是shutil.rmtree
告诉文件系统删除一些目录树,并且在那一刻 Python 会终止该语句的工作 --即使文件系统没有删除完整的目录树 --.因此,如果目录树足够大,当 Python 到达os.makedirs(dir_name)
行时,目录仍然可以存在。
一个更快的操作(比删除更快)是重命名目录:
import os
import tempfile
import shutil
dir_name = "test"
if (os.path.exists(dir_name)):
# `tempfile.mktemp` Returns an absolute pathname of a file that
# did not exist at the time the call is made. We pass
# dir=os.path.dirname(dir_name) here to ensure we will move
# to the same filesystem. Otherwise, shutil.copy2 will be used
# internally and the problem remains.
tmp = tempfile.mktemp(dir=os.path.dirname(dir_name))
# Rename the dir.
shutil.move(dir_name, tmp)
# And delete it.
shutil.rmtree(tmp)
# At this point, even if tmp is still being deleted,
# there is no name collision.
os.makedirs(dir_name)
【讨论】:
我刚刚运行了你的代码几次。有用。谢谢。 @ThS 我很高兴为您提供帮助,不要忘记投票并检查答案。 我想,但我没有必要的 15 声望。【参考方案2】:这个呢?
import shutil
import os
dir = '/path/to/directory'
if not os.path.exists(dir):
os.makedirs(dir)
else:
shutil.rmtree(dir)
os.makedirs(dir)
【讨论】:
这真的不会改进 OP 的代码。也没有解释为什么 OP 会出现这个错误。除了您的答案与此太相似:***.com/questions/11660605/… 我同意@RaydelMiranda以上是关于Python:如何创建目录并在必要时覆盖现有目录?的主要内容,如果未能解决你的问题,请参考以下文章
如何让 Wordpress 页面覆盖现有目录(不是子目录)?