关于python:如何递归地创建目录?

How can I create directories recursively?

有没有python方法可以递归地创建目录?我有这条路:

1
/home/dail/

我想创建

1
/home/dail/first/second/third

我可以递归地执行,还是必须创建一个接一个的目录?

同样的事情:

chmod和chown我可以在没有为每个文件/dir分配权限的情况下递归执行吗?


你需要的是os.makedirs。对于chmodchown,您必须使用os.walk,并自己在每个文件/dir上使用它。


一个非常古老的问题的新答案:

从python 3.2开始,您可以这样做:

1
2
3
import os
path = '/home/dail/first/second/third'
os.makedirs(path, exist_ok=True)

多亏了exist_ok标志,如果目录存在(取决于您的需要….),这甚至不会抱怨。

从python 3.4(包括pathlib模块)开始,您可以这样做:

1
2
3
from pathlib import Path
path = Path('/home/dail/first/second/third')
path.mkdir(parents=True)

从python 3.5开始,mkdir也有一个exist_ok标志-如果目录存在,将其设置为True将不会引发异常:

1
path.mkdir(parents=True, exist_ok=True)


下面是我的实现,供您参考:

1
2
3
4
5
6
def _mkdir_recursive(self, path):
    sub_path = os.path.dirname(path)
    if not os.path.exists(sub_path):
        self._mkdir_recursive(sub_path)
    if not os.path.exists(path):
        os.mkdir(path)

希望这有帮助!


我同意cat plus的回答。但是,如果您知道这只会在类Unix操作系统上使用,那么您可以对shell命令mkdirchmodchown使用外部调用。确保传递额外的标志以递归地影响目录:

1
2
3
4
5
6
7
8
9
10
11
>>> import subprocess
>>> subprocess.check_output(['mkdir', '-p', 'first/second/third'])
# Equivalent to running 'mkdir -p first/second/third' in a shell (which creates
# parent directories if they do not yet exist).

>>> subprocess.check_output(['chown', '-R', 'dail:users', 'first'])
# Recursively change owner to 'dail' and group to 'users' for 'first' and all of
# its subdirectories.

>>> subprocess.check_output(['chmod', '-R', 'g+w', 'first'])
# Add group write permissions to 'first' and all of its subdirectories.

edit i最初使用的是commands,这是一个糟糕的选择,因为它不受欢迎并且容易受到注入攻击。(例如,如果用户提供了创建名为first/;rm -rf --no-preserve-root /;的目录的输入,则可能会删除所有目录)。

编辑2如果您使用的是小于2.7的python,请使用check_call而不是check_output。详见subprocess文件。


尝试使用os.makedirs:

1
2
3
4
5
6
7
8
import os
import errno

try:
    os.makedirs(<path>)
except OSError as e:
    if errno.EEXIST != e.errno:
        raise