[英]os.mkdir(path) returns OSError when directory does not exist
我正在调用os.mkdir
来创建一个os.mkdir
特定生成数据的文件夹。 但是,即使我指定的路径尚未创建, os.mkdir(path)
引发路径已存在的 OSError。
例如,我调用:
os.mkdir(test)
此调用导致OSError: [Errno 17] File exists: 'test'
即使我在任何地方都没有测试目录或名为 test 的文件。
注意:我使用的实际路径名不是“test”,而是一些更晦涩的东西,我确信没有在任何地方命名。
请帮助?
格雷格的回答是正确的,但还远远不够。 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 3.2 及更高版本中,您可以使用:
os.makedirs(path, exist_ok=True)
以避免在目录已经存在时出现异常。 如果path
存在并且不是目录,这仍然会引发异常。
只需检查路径是否存在。 如果不创建它
import os
if not os.path.exists(test):
os.makedirs(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))
您有一个名为test
的文件。 您不能创建具有完全相同名称的目录。
在 Windows 上发生在我身上,也许是这样:
像你一样,我试图:
os.mkdir(dirname)
并得到OSError: [Errno 17] File exists: '<dirname>'
。 当我跑:
os.path.exists(dirname)
我弄错了,这让我发疯了一段时间:)
问题是:在某个窗口中,我在特定目录中。 即使当时它不存在(我从 linux 中删除了它)。 解决方案是关闭该窗口\\导航到其他地方。 可耻,我知道...
我不知道你的文件系统的细节。 但是,如果您真的想解决这个问题,可以使用 try/except 子句吗?
try:
os.mkdir(test)
except OSError:
print "test already exists"
在此期间,您始终可以进行某种调试。
也许该目录中有一个名为 test 的隐藏文件夹。 手动检查是否存在。
ls -a
仅当文件不存在时才创建该文件。
if not os.path.exists(test):
os.makedirs(test)
对于python 2.7
from distutils.dir_util import mkpath
mkpath(path)
不需要任何额外导入的简单答案,不会抑制诸如“权限被拒绝”、“设备上没有剩余空间”等错误,但接受目录可能已经存在:
import os
try:
os.mkdir(dirname)
except FileExistsError :
pass
except :
raise
没有看到有关此特定解决方案的任何其他答案或评论。 但请确保您是否正在积极管理您在运行代码之前注销并重新登录的文件夹权限。 我用头撞墙大约一个小时,试图弄清楚我的问题是什么,就是这样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.