是否有一种方法可以从Python内部获得类似于shell上的mkdir -p的功能。我正在寻找一个解决方案,而不是系统调用。我确信代码少于20行,我想知道是否有人已经写了它?
当前回答
对于Python≥3.5,使用pathlib.Path.mkdir:
import pathlib
pathlib.Path("/tmp/path/to/desired/directory").mkdir(parents=True, exist_ok=True)
exist_ok形参在Python 3.5中添加。
适用于Python≥3.2版本。makedirs有一个可选的第三个参数exist_ok,当它为True时,启用mkdir -p功能——除非提供了mode,并且现有目录的权限与预期的权限不同;在这种情况下,OSError会像之前一样被引发:
import os
os.makedirs("/tmp/path/to/desired/directory", exist_ok=True)
对于更老版本的Python,您可以使用os。Makedirs并忽略错误:
import errno
import os
def mkdir_p(path):
try:
os.makedirs(path)
except OSError as exc: # Python ≥ 2.5
if exc.errno == errno.EEXIST and os.path.isdir(path):
pass
# possibly handle other errno cases here, otherwise finally:
else:
raise
其他回答
我个人已经成功地使用以下方法,但我的函数可能应该被称为“确保此目录存在”:
def mkdirRecursive(dirpath):
import os
if os.path.isdir(dirpath): return
h,t = os.path.split(dirpath) # head/tail
if not os.path.isdir(h):
mkdirRecursive(h)
os.mkdir(join(h,t))
# end mkdirRecursive
我认为Asa的回答基本上是正确的,但你也可以将其扩展一点,使其更像mkdir -p:
import os
def mkdir_path(path):
if not os.access(path, os.F_OK):
os.mkdirs(path)
or
import os
import errno
def mkdir_path(path):
try:
os.mkdirs(path)
except os.error, e:
if e.errno != errno.EEXIST:
raise
这两种方法都可以处理路径已经静默存在但会出现其他错误的情况。
对于Python≥3.5,使用pathlib.Path.mkdir:
import pathlib
pathlib.Path("/tmp/path/to/desired/directory").mkdir(parents=True, exist_ok=True)
exist_ok形参在Python 3.5中添加。
适用于Python≥3.2版本。makedirs有一个可选的第三个参数exist_ok,当它为True时,启用mkdir -p功能——除非提供了mode,并且现有目录的权限与预期的权限不同;在这种情况下,OSError会像之前一样被引发:
import os
os.makedirs("/tmp/path/to/desired/directory", exist_ok=True)
对于更老版本的Python,您可以使用os。Makedirs并忽略错误:
import errno
import os
def mkdir_p(path):
try:
os.makedirs(path)
except OSError as exc: # Python ≥ 2.5
if exc.errno == errno.EEXIST and os.path.isdir(path):
pass
# possibly handle other errno cases here, otherwise finally:
else:
raise
如果文件已经存在,Mkdir -p会给出一个错误:
$ touch /tmp/foo
$ mkdir -p /tmp/foo
mkdir: cannot create directory `/tmp/foo': File exists
因此,对前面建议的改进是,如果os.path.isdir返回False(在检查errno.EEXIST时),将重新引发异常。
(更新)看看这个高度相似的问题;我同意公认的答案(和注意事项),除了我建议os.path.isdir而不是os.path.exists。
(更新)根据评论中的建议,完整的功能看起来像:
import os
def mkdirp(directory):
if not os.path.isdir(directory):
os.makedirs(directory)
最近,我发现这个distutils.dir_util.mkpath:
In [17]: from distutils.dir_util import mkpath
In [18]: mkpath('./foo/bar')
Out[18]: ['foo', 'foo/bar']
推荐文章
- 如何在f字符串中转义括号?
- Python void返回类型注释
- 如何在Webpack配置中创建多个输出路径
- 如何为python模块的argparse部分编写测试?
- 在python中是否有用于均方根误差(RMSE)的库函数?
- 如何从matplotlib (pyplot。Figure vs matplotlib。figure) (frameon=False matplotlib中有问题)
- django test app error -在创建测试数据库时出现错误:创建数据库的权限被拒绝
- 识别使用pip安装的python包的依赖关系
- 从字符串变量导入模块
- 如何删除Python中的前导空白?
- python中的assertEquals和assertEqual
- 如何保持Python打印不添加换行符或空格?
- 为什么Python的无穷散列中有π的数字?
- Python 3.7数据类中的类继承
- 如何在PyTorch中初始化权重?