在路径中制作所有目录的优雅方式

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)
   

【讨论】:

以上是关于在路径中制作所有目录的优雅方式的主要内容,如果未能解决你的问题,请参考以下文章

一种消耗(所有字节)BinaryReader 的优雅方式?

在 WPF 中优雅地覆盖 ComboBox 的 ToggleButton 样式

如何优雅地在LaTeX中使用中文?

如何优雅地运用位运算实现产品需求?

如何优雅的使用RabbitMQ

SpringCloud 优雅下线+灰度发布