有没有一种Python方法可以递归创建目录?我有这个路径:
/home/dail/
我想创建
/home/dail/first/second/third
我能递归地做吗,还是必须一个接一个地创建目录?
chmod 和 chown 能否递归地执行操作,而无需分别为每个文件/目录分配权限?
有没有一种Python方法可以递归创建目录?我有这个路径:
/home/dail/
我想创建
/home/dail/first/second/third
我能递归地做吗,还是必须一个接一个地创建目录?
chmod 和 chown 能否递归地执行操作,而无需分别为每个文件/目录分配权限?
从Python 3.2开始,您可以这样做:
import os
path = '/home/dail/first/second/third'
os.makedirs(path, exist_ok=True)
感谢exist_ok
标志,如果目录已经存在,则即使根据您的需求也不会发出投诉。
从Python 3.4开始(包括pathlib模块),您可以这样做:
from pathlib import Path
path = Path('/home/dail/first/second/third')
path.mkdir(parents=True)
从Python 3.5开始,mkdir
也有一个exist_ok
标志 - 将其设置为True
如果目录存在,则不会引发异常:
path.mkdir(parents=True, exist_ok=True)
pathlib
对我很有用。 - Manthan Patelos.makedirs
是您需要的。对于 chmod
或 chown
,您将需要使用 os.walk
并在每个文件/目录上手动执行。
exist_ok=True
这个参数非常方便,可以避免每次都要检查文件是否已经存在。 - ideasman42exist_ok
参数。 - JKillian尝试使用os.makedirs函数:
import os
import errno
try:
os.makedirs(<path>)
except OSError as e:
if errno.EEXIST != e.errno:
raise
os.path.exists
方法相比)。 - wonder.micedef _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 Plus的答案。然而,如果你知道这个程序只会在类Unix操作系统上使用,你可以使用外部调用shell命令mkdir
、chmod
和chown
。确保传递额外的标志以递归影响目录:
>>> 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
。详见subprocess
文档。
walk
双重循环-(每个walk
ed dir中的文件的第二个循环))实现所需内容时。当然,我本可以用bash编写它们,但我觉得Python的语法很方便(易于定义函数/类),并且对所有命令行标志都有访问权限,这对我很方便。 - dr jimbobos.chmod
和os.chown
没有递归选项)。说分叉总是不好似乎是一种过早的优化。 - dr jimbobshell=True
),当您已经熟悉用于完成任务的shell命令,并且这是您不介意使用shell脚本完成的任务时,它非常有用(即在这里,您不会为每个命令优化几毫秒的差异)。 我真的不在乎你是否对此进行了负评(现在它被锁定了),尽管我不同意这是一个"明显而且可能危险错误的答案",应该被投票下降。 - dr jimbob