如何在使用makedirs创建文件夹时,如果文件夹已存在,则覆盖它?

77
以下代码可让我创建一个目录(如果该目录不存在)。
dir = 'path_to_my_folder'
if not os.path.exists(dir):
    os.makedirs(dir)

这个文件夹将被一个程序用来写入文本文件。但是下次打开我的程序时,我想要一个全新的、空的文件夹。

如果文件夹已经存在,有没有一种方法可以覆盖该文件夹(并创建一个同名的新文件夹)?


2
需要注意的是,虽然这可能与您无关,但这里所有的答案都存在竞态条件(虽然在所提出的问题中不可能完全消除它们,但通过使用EAFP可以做得更好)。 - Julian
6个回答

127
import os
import shutil

dir = 'path_to_my_folder'
if os.path.exists(dir):
    shutil.rmtree(dir)
os.makedirs(dir)

33
import os
import shutil

path = 'path_to_my_folder'
if not os.path.exists(path):
    os.makedirs(path)
else:
    shutil.rmtree(path)           # Removes all the subdirectories!
    os.makedirs(path)

那怎么样?看看shutilPython库吧!


这也可以运行。但这是一个相当常见的模块吗?这段代码需要在许多机器上实现。 - Shankar Kumar
1
@ShankarKumar 是的。shutilPython 2.4 起就是 Python 内置库的一部分了。我个人认为,由于它带来的一些简化,shutilos 更好。 - cybertextron
非常感谢你,兄弟!CRACK - DANIEL ROSAS PEREZ

14

os.path.exists(dir)的检查是推荐的,但可以通过使用ignore_errors来避免。


dir = 'path_to_my_folder'
shutil.rmtree(dir, ignore_errors=True)
os.makedirs(dir)

为什么推荐使用 os.path.exists(dir)?相较于你的方法,是否有任何优势? - Ali_Sh
@Ali_Sh 在 Python 中的惯用做法是“宁愿请求宽恕,也不要事先获得许可”。在这里,ignore_errors 扮演了同样的角色。 - shrishinde
@Ali_Sh,ignore_errors忽略所有错误,而不仅仅是缺少目录错误。 - Sandell0

2

就这样说吧

dir = 'path_to_my_folder'
if not os.path.exists(dir): # if the directory does not exist
    os.makedirs(dir) # make the directory
else: # the directory exists
    #removes all files in a folder
    for the_file in os.listdir(dir):
        file_path = os.path.join(dir, the_file)
        try:
            if os.path.isfile(file_path):
                os.unlink(file_path) # unlink (delete) the file
        except Exception, e:
            print e

谢谢,这个很好用!你介意解释一下背后的逻辑吗?我是初学者,所以想尽可能多地学习! - Shankar Kumar
如果您要删除的目录中有子目录,则此方法将失败。这时,您需要调用 os.walk 来解决这个问题。更简单的解决方案是使用 shutil.rmtree - inspectorG4dget
这是否免疫竞态条件? - Shankar Kumar

2

这里是 EAFP(宁愿请求原谅,也不要事先获准)版本:

import errno
import os
from shutil import rmtree
from uuid import uuid4

path = 'path_to_my_folder'
temp_path = os.path.dirname(path)+'/'+str(uuid4())
try:
    os.renames(path, temp_path)
except OSError as exception:
    if exception.errno != errno.ENOENT:
        raise
else:
    rmtree(temp_path)
os.mkdir(path)

1
欢迎来到Stack Overflow!这是您的第一个答案,需要经过我的审核。在回答一个已有被接受的答案的旧问题时,值得强调您正在为现有解决方案添加什么内容。在这种情况下,您能否解释为什么您认为这段代码不会引起竞争条件?例如 - 如果在调用glob.iglob()之后向目录写入文件,会发生什么 - 您能描述一下为什么您的解决方案不容易出现竞争条件的原因吗?此外:您可能考虑解释一下EAFP代表什么意思。注:由于原始评论中存在错误,我已重新发布编辑后的评论。 - J Richard Snape
@JRichardSnape 是的,你说得对,这段代码不能免疫竞态条件。我认为新版本已经满足了这个要求。 - El Ruso
1
我认为最简单的方法是这样做:try: os.mkdir(path) except FileExistsError: shutil.rmtree(path) os.mkdir(path) - Ted Klein Bergman

0
try:
    os.mkdir(path)
except FileExistsError:
    pass

4
这并不会覆盖该目录,它只是在目录不存在时创建该目录。 - Ted Klein Bergman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接