当目录不存在时,os.mkdir(path)返回OSError

时间:2013-09-24 05:14:22

标签: python system mkdir

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

例如,我打电话给:

os.mkdir(test)

即使我没有测试目录或名为test的文件,此调用也会生成OSError: [Errno 17] File exists: 'test'

注意:我使用的实际路径名称不是“测试”,而是更加模糊,我确信不会在任何地方命名。

请帮忙吗?

11 个答案:

答案 0 :(得分:34)

格雷格的回答是正确的,但还远远不够。 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的代码可以抑制所有操作系统错误; <{1}}就像except Exception一样不安全。

答案 1 :(得分:23)

检查路径是否存在。如果没有创建它

if not os.path.exists(test):
        os.makedirs(test)

答案 2 :(得分:17)

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

os.makedirs(path, exist_ok=True)

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

答案 3 :(得分:3)

我也遇到了同样的问题,特别是当字符串'test'包含多个目录名时。 所以当'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))  

答案 4 :(得分:1)

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

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

您可以随时进行某种调试。

答案 5 :(得分:1)

您的文件名为test。您无法创建具有完全相同名称的目录。

答案 6 :(得分:1)

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

和我一样,我试图:

os.mkdir(dirname)

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

os.path.exists(dirname)

我弄错了,它让我疯了一会儿:)

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

答案 7 :(得分:0)

可能是目录中存在隐藏文件夹名称测试。如果存在,请手动检查。

ls -a

仅在不存在的情况下创建

if not os.path.exists(test):
    os.makedirs(test)

答案 8 :(得分:0)

对于python 2.7

from distutils.dir_util import mkpath
mkpath(path)

答案 9 :(得分:0)

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

import os

try:
    os.mkdir(dirname)
except FileExistsError :
    pass
except :
    raise

答案 10 :(得分:0)

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