我该如何创建一个目录,并创建任何缺失的父级目录?

5602
如何在给定的路径下创建目录,并创建该路径上任何缺失的父目录?例如,Bash 命令 mkdir -p /path/to/nested/directory 可以实现此功能。

41
一般情况下,你可能需要考虑文件名中不存在目录的情况。在我的机器上,dirname('foo.txt')返回'',表示该目录不存在,会导致makedirs()函数失败。请注意不改变原意,使翻译更加通俗易懂。 - Brian Hawkins
9
如果路径存在,不仅需要检查它是否是一个目录而不是一个普通文件或其他对象(许多答案都会检查这一点),还需要检查它是否可写(我没有找到检查这个的答案)。 - miracle173
14
如果您想创建文件路径字符串 p 的父目录,这是我的代码片段:os.makedirs(p[:p.rindex(os.path.sep)], exist_ok=True) - Thamme Gowda
在 Windows 10 中,如果我在文件浏览器中显示目录,则使用 Python(使用3.7.4版本)创建该目录,即使指定exist_ok=True也会返回“文件已存在”的错误。但是,当我关闭文件浏览器并重新运行Python程序时,程序可以正常运行。 - Bruce
29个回答

10

在创建目录之前,您必须设置完整路径:

import os,sys,inspect
import pathlib

currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
your_folder = currentdir + "/" + "your_folder"

if not os.path.exists(your_folder):
   pathlib.Path(your_folder).mkdir(parents=True, exist_ok=True)

这对我有效,希望对你也有效


9

我看到了Heikki ToivonenA-B-B的回答,思考出了这个变体。

import os
import errno

def make_sure_path_exists(path):
    try:
        os.makedirs(path)
    except OSError as exception:
        if exception.errno != errno.EEXIST or not os.path.isdir(path):
            raise

9
我使用 os.path.exists()这里 是一个Python 3脚本,可以用来检查目录是否存在,如果不存在则创建,如果存在则删除(如果需要)。
它会提示用户输入目录,并且可以很容易地进行修改。

如果您创建了此脚本,请将其包含在答案中。链接可能会因链接页面更改而失效。 - Ryan M

9

您可以向os.makedirs()函数传递exist_ok=True参数,以便在目录已经存在的情况下抑制错误:

import os

# Create directory /path/to/nested/directory if it doesn't already exist
os.makedirs('/path/to/nested/directory', exist_ok=True)

非常干净简洁的解决方案,不需要if语句! - undefined

8

在你的程序/项目入口点调用函数create_dir()

import os

def create_dir(directory):
    if not os.path.exists(directory):
        print('Creating Directory '+directory)
        os.makedirs(directory)

create_dir('Project directory')

8
使用这个命令检查并创建目录:
 if not os.path.isdir(test_img_dir):
     os.mkdir(test_img_dir)

这不会创建父目录。根据 os.mkdir 的文档:"如果路径中的某个父目录不存在,则会引发 FileNotFoundError" - Ryan M

6

您可以使用os.listdir来实现:

import os
if 'dirName' in os.listdir('parentFolderPath')
    print('Directory Exists')

6

如果您考虑以下内容:

os.path.isdir('/tmp/dirname')

表示目录(路径)存在且是一个目录。所以对于我来说,这种方法可以满足我的需求。因此,我可以确保它是一个文件夹(而不是一个文件)并且存在。


3

这可能并不完全回答了问题。但我猜测你的真正意图是在一个命令中创建一个文件及其父目录,并给定它的内容。

你可以使用fastcore扩展来操作路径:path.mk_write(data)

from fastcore.utils import Path
Path('/dir/to/file.txt').mk_write('Hello World')

fastcore文档中查看更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接