"如何递归创建目录?"

2024-04-19 16:10:02 发布

您现在位置:Python中文网/ 问答频道 /正文

是否有Python方法递归地创建目录?我有这条路:

/home/dail/

我想创造

/home/dail/first/second/third

我可以递归地做吗?或者我必须一个接一个地创建一个目录?

同样的事情:

chmodchown我可以不为每个文件/目录分配权限而递归地执行吗?


Tags: 文件方法目录权限home事情firstchmod
3条回答

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

>>> 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.

编辑我最初使用commands,这是一个错误的选择,因为它被弃用并且容易受到注入攻击。(例如,如果用户输入创建名为first/;rm -rf --no-preserve-root /;的目录,则可能会删除所有目录)。

编辑2如果使用的Python小于2.7,请使用check_call,而不是check_output。有关详细信息,请参见^{} documentation

对一个古老问题的新回答:

从Python3.2开始,您可以执行以下操作:

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

多亏了^{} flag,如果目录存在(取决于您的需要……),这甚至不会抱怨。


从python 3.4(包括pathlib module)开始,您可以执行以下操作:

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

从python 3.5开始^{} also has an ^{} flag-如果目录存在,则将其设置为True不会引发异常:

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

你需要的是^{}。对于chmodchown,您必须使用os.walk并在每个文件/目录上使用它。

相关问题 更多 >