优雅的方式使所有的dirs在一条路上

mar*_*arw 37 python path

这里有四条路径:

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'
Run Code Online (Sandbox Code Playgroud)

目录可能存在也可能不存在于驱动器上.在每条路径中创建目录最优雅的方法是什么?

我正在考虑os.path.split()在循环中使用,并检查目录os.path.exists,但我不知道它有更好的方法.

Dav*_*nan 55

您正在寻找os.makedirs()哪种能够满足您的需求.

文件说明:

递归目录创建功能.像mkdir()一样,但是需要包含叶子目录的所有中间级目录.如果leaf目录已存在或无法创建,则引发错误异常.

因为如果叶子目录已经存在,它会失败,你需要在调用之前测试是否存在os.makedirs().

  • @David Heffernan:你是对的,它不会解决所有问题,例如世界饥饿.一步一步来.顺便说一下,如果你不喜欢`try:except`; 使用`exist_ok = True`. (10认同)
  • 大声笑.Python为1:0.不敢相信我错过了那个,而且我一直在使用`os.mkdir()`.谢谢,大卫:) (2认同)
  • 对存在的测试引入了可能的竞争条件(在你通过*调用`makedirs()之前*之前测试它的存在之后,可能会创建目录*).所以只要在没有测试的情况下使用`try:..除了OSError`. (2认同)

axw*_*ell 20

在Python 3.6+上你可以这样做:

import pathlib

path = pathlib.Path(p4)
path.parent.mkdir(parents=True, exist_ok=True)
Run Code Online (Sandbox Code Playgroud)

  • pathlib模块需要一个宣传活动.太棒了. (8认同)
  • 我也爱它。这里只有一行: `pathlib.Path("/path/with/dirs").mkdir(parents=True, exit_ok=True)` (5认同)
  • @RickTeachey 非常同意 (2认同)