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 页面覆盖现有目录(不是子目录)?

Python 检查目录是不是存在,然后在必要时创建它并将图形保存到新目录? [复制]

Effective Java目录

Shopify 在选择变体时触发功能,但不会覆盖现有功能

如何覆盖数据库中的项目而不是创建新项目

如何使用 python 覆盖复制完整目录及其内容?