在路径中制作所有目录的优雅方式
Posted
技术标签:
【中文标题】在路径中制作所有目录的优雅方式【英文标题】:Elegant way to make all dirs in a path 【发布时间】:2011-07-09 19:22:56 【问题描述】:这里有四个路径:
p1=r'\foo\bar\foobar.txt'
p2=r'\foo\bar\foo\foo\foobar.txt'
p3=r'\foo\bar\foo\foo2\foobar.txt'
p4=r'\foo2\bar\foo\foo\foobar.txt'
目录可能存在也可能不存在于驱动器上。在每个路径中创建目录的最优雅的方式是什么?
我正在考虑在循环中使用os.path.split()
,并使用os.path.exists
检查目录,但我不知道是否有更好的方法。
【问题讨论】:
差不多:***.com/q/6004073/1959808 【参考方案1】:您正在寻找的 os.makedirs()
正是您所需要的。
文档说明:
递归目录创建函数。 像 mkdir(),但使所有 需要中级目录 包含叶子目录。加注 如果叶子出现错误异常 目录已存在或不能存在 已创建。
因为如果叶目录已经存在,它会失败,您需要在调用 os.makedirs()
之前测试它是否存在。
【讨论】:
大声笑。 1:0 用于 Python。不敢相信我错过了这一点,而且我一直在使用os.mkdir()
。谢谢,大卫 :)
@marw 我也从未听说过,我只是用神奇的关键字“递归”进行了网络搜索!
对存在性的测试引入了可能的竞争条件(目录可能是在您对makedirs()
调用之前测试其存在性之后创建的)。所以不用测试就用try: .. except OSError
。
@David Heffernan:你说得对,它不能解决所有问题,例如世界饥饿。一步一步来。顺便说一句,如果你不喜欢try: except
;使用exist_ok=True
。
@J.F. exists_ok 很整洁,我没有看到它,因为它似乎很新——我在看 2.7 文档。谢谢!【参考方案2】:
在 Python 3.6+ 上,您可以这样做:
import pathlib
path = pathlib.Path(p4)
path.parent.mkdir(parents=True, exist_ok=True)
【讨论】:
pathlib 模块需要宣传活动。太棒了。 @RickTeachey 完全同意 我也喜欢。这里只有一行:pathlib.Path("/path/with/dirs").mkdir(parents=True, exist_ok=True)
【参考方案3】:
在 POSIX 系统中构建路径的简单方法。假设您的路径类似于:dirPath = '../foo/bar'
,其中既不存在 foo
也不存在 bar
:
path = ''
for d in dirPath.split('/'):
# handle instances of // in string
if not d: continue
path += d + '/'
if not os.path.isdir(path):
os.mkdir(path)
【讨论】:
以上是关于在路径中制作所有目录的优雅方式的主要内容,如果未能解决你的问题,请参考以下文章