51

我正在调用os.mkdir创建一个包含一组生成数据的文件夹。但是,即使我指定的路径尚未创建,也会os.mkdir(path)引发 OSError 表明该路径已存在。

例如,我调用:

os.mkdir(test)

OSError: [Errno 17] File exists: 'test'即使我在任何地方都没有测试目录或名为 test 的文件,也会导致此调用。

注意:我使用的实际路径名不是“测试”,而是更模糊的东西,我确定没有在任何地方命名。

请帮忙?

4

11 回答 11

65

格雷格的回答是正确的,但还远远不够。 OSError有子错误条件,你不想每次都压制它们。捕获只是预期的操作系统错误是谨慎的。

在决定抑制异常之前进行额外的检查,如下所示:

import errno
import os

try:
    os.mkdir(dirname)
except OSError as exc:
    if exc.errno != errno.EEXIST:
        raise
    pass

您可能不想抑制errno.EACCES(权限被拒绝)、errno.ENOSPC(设备上没有剩余空间)、errno.EROFS (只读文件系统)等。或者您可能确实想要 - 但这需要根据具体情况做出有意识的决定你正在构建的逻辑。

Greg 的代码抑制了所有操作系统错误;那是不安全的,就像except Exception不安全一样。

正如其他人指出的那样,较新版本的 Python 提供os.makedirs()了仅在目录不存在时才尝试创建目录,相当于mkdir -p从 unix 命令行创建目录。

于 2014-03-28T16:30:46.540 回答
60

在 Python 3.2 及更高版本中,您可以使用:

os.makedirs(path, exist_ok=True)

如果目录已经存在,以避免出现异常。path如果存在并且不是目录,这仍然会引发异常。

于 2017-10-08T07:09:55.280 回答
38

只需检查路径是否存在。如果不创建它

import os    
if not os.path.exists(test):
    os.makedirs(test)
于 2013-09-24T05:19:10.753 回答
3

在Windows上发生在我身上,也许是这种情况:

像你一样,我试图:

os.mkdir(dirname)

得到了OSError: [Errno 17] File exists: '<dirname>'。当我跑的时候:

os.path.exists(dirname)

我弄错了,这让我发疯了一阵子:)

问题是:在某个窗口中,我位于特定目录中。即使它当时不存在(我从 linux 中删除了它)。解决方案是关闭该窗口\导航到其他地方。可耻,我知道...

于 2013-11-20T13:34:01.627 回答
3

我也遇到了同样的问题,特别是当字符串“test”包含多个目录名称时。因此,当“测试”包含单个目录时 -

if not os.path.exists(test):
    try:
        os.makedir(test)
    except:
        raise OSError("Can't create destination directory (%s)!" % (test))  

如果 'test' 包含多个目录,如 '\dir1\dir2' 然后 -

if not os.path.exists(test):
    try:
        os.makedirs(test)
    except:
        raise OSError("Can't create destination directory (%s)!" % (test))  
于 2015-07-02T15:25:20.157 回答
1

您在那里有一个名为 的文件test。您不能创建具有完全相同名称的目录。

于 2013-09-24T05:18:11.060 回答
1

不需要任何额外导入的简单答案,不会抑制诸如“权限被拒绝”、“设备上没有剩余空间”等错误,但接受该目录可能已经存在:

import os

try:
    os.mkdir(dirname)
except FileExistsError :
    pass
except :
    raise
于 2020-05-13T21:58:27.633 回答
0

我不知道你的文件系统的细节。但是如果你真的想解决这个问题,也许可以使用 try/except 子句?

try:
    os.mkdir(test)
except OSError:
    print "test already exists"

同时,您总是可以进行某种调试。

于 2013-09-24T05:16:09.487 回答
0

也许该目录中有一个名为 test 的隐藏文件夹。手动检查它是否存在。

ls -a

仅当文件不存在时才创建该文件。

if not os.path.exists(test):
    os.makedirs(test)
于 2013-09-24T05:21:19.897 回答
0

对于python 2.7

from distutils.dir_util import mkpath
mkpath(path)
于 2019-09-06T12:02:04.033 回答
0

没有看到有关此特定解决方案的任何其他答案或评论。但请确保您是否正在积极管理您退出并在运行代码之前重新登录的文件夹权限。我把头撞在墙上大约一个小时,试图弄清楚我的问题是什么,就是这样。

于 2021-08-10T16:15:11.407 回答