我正在使用Python编写一个文件,我希望它被放置在一个特定的路径上。

也就是说:我如何检查文件夹是否存在,与其父母一起?如果路线上缺少文件夹,我如何创建它们?


当前回答

查看 os.makedirs: (它确保完整的路径存在) 要处理可能存在的目录的事实,查找 OSError. (如果存在_ok 是假的(默认情况下),如果目标目录已经存在,则会升起 OSError。

import os
try:
    os.makedirs('./path/to/somewhere')
except OSError:
    pass

其他回答

从 Python 3.5 开始, pathlib.Path.mkdir 有一个 exist_ok 旗帜:

from pathlib import Path
path = Path('/my/directory/filename.txt')
path.parent.mkdir(parents=True, exist_ok=True) 
# path.parent ~ os.path.dirname(path)

此可重复创建目录,如果目录已经存在,则不会产生例外。

(就像 os.makedirs 得到 exist_ok 旗帜从 python 3.2 e.g os.makedirs(路径, exist_ok=True))


注意:当我发表这个答案时,没有其他提到的答案存在_OK...

在 Python ≥ 3.5 上使用 pathlib.Path.mkdir:

from pathlib import Path
Path("/my/directory").mkdir(parents=True, exist_ok=True)

对于旧版本的Python,我看到两个答案有良好的品质,每一个有一个小错误,所以我会给我的答案:

import os
if not os.path.exists(directory):
    os.makedirs(directory)

正如评论和其他地方所指出的那样,有一个赛事状态 - 如果目录在 os.path.exists 和 os.makedirs 呼叫之间创建, os.makedirs 会失败 OSError. 不幸的是,包装捕捉 OSError 和继续不是虚假的,因为它会忽略由于其他因素创建目录的失败,如不够的许可,完整的磁盘等。

import os, errno

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

否则,可能有第二个 os.path.exists,但假设另一个创建了目录后第一次检查,然后删除它之前的第二个 - 我们仍然可以被误导。

现代版本的Python改进这个代码相当一点,两者都通过曝光FileExistsError(在3.3+)。

try:
    os.makedirs("path/to/directory")
except FileExistsError:
    # directory already exists
    pass

...和允许一个关键词论点给os.makedirs称为 exist_ok(在3.2+)。

os.makedirs("path/to/directory", exist_ok=True)  # succeeds even if directory exists.

我下载了下面的文章,但这不是完全愚蠢的。

import os

dirname = 'create/me'

try:
    os.makedirs(dirname)
except OSError:
    if os.path.exists(dirname):
        # We are nearly safe
        pass
    else:
        # There was an error on creation, so make sure we know about it
        raise

如今,正如我所说的那样,这不是真正的愚蠢,因为我们有可能无法在那个时期创建目录,还有另一个创建过程。

检查是否有一个目录,并在需要时创建它。

if not os.path.exists(d):
    os.makedirs(d)

import errno
try:
    os.makedirs(d)
except OSError as exception:
    if exception.errno != errno.EEXIST:
        raise

import tempfile

d = tempfile.mkdtemp()

有一个新的路径对象(如3.4)与许多方法,你会想使用路径 - 其中一个是 mkdir。

首先,相关进口:

from pathlib import Path
import tempfile

我们不需要处理 os.path.join 现在 - 只是加入路径部分与一个 /:

directory = Path(tempfile.gettempdir()) / 'sodata'

然后我无力地确保目录存在 - 存在_ok 论点在 Python 3.5 中出现:

directory.mkdir(exist_ok=True)

下面是文档的相关部分:

如果 exist_ok 是真实的,FileExistsError 例外将被忽略(与 POSIX mkdir -p 命令相同的行为),但只有如果最后的路径组件不是现有的非指南文件。

todays_file = directory / str(datetime.datetime.utcnow().date())
if todays_file.exists():
    logger.info("todays_file exists: " + str(todays_file))
    df = pd.read_json(str(todays_file))

路径对象必须在等待路径可以使用的其他API之前被强迫到Str。

也许Pandas应该更新以接受抽象基础类,os.PathLike的例子。

您可以使用 os.listdir 为此:

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