HOWTO · Python
Python 检查目录是否存在
本教程演示了如何在 Python 中检查一个特定的目录是否存在。
本页内容
要检查某个路径是否指向目录,请使用 os.path.isdir();如果使用 Path 对象,则使用 Path.is_dir()。这两种检查都能区分目录和文件。下面的示例使用临时路径,因此不依赖当前工作目录中已经存在某个文件夹。
使用 os.path.isdir() 检查目录是否存在
os.path.isdir(path) 在路径指向一个已存在的目录时返回 True;如果路径指向文件或不存在的路径,则返回 False。它接受路径字符串和类路径对象。当你要确认目标是否为目录时,应使用这个函数。
运行以下示例:
本节中的代码以及显示的标签或输出仍为英文。
import os
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as temp_dir:
root = Path(temp_dir)
directory = root / "reports"
directory.mkdir()
file_path = root / "notes.txt"
file_path.write_text("draft", encoding="utf-8")
print(os.path.isdir(directory))
print(os.path.exists(file_path))
print(os.path.isdir(file_path))
print((root / "archive").exists())
True
True
False
False
临时工作区中有一个目录、一个普通文件,以及一个尚未创建的路径。第一次和第三次检查说明了为什么 os.path.isdir() 适合用于区分目录和文件。其他调用使用下文介绍的通用存在性检查。
使用 os.path.exists() 检查路径是否存在
os.path.exists(path) 检查的是一个范围更广的问题:此路径上是否存在文件或目录?无论是哪一种,它都会返回 True,因此单靠它无法确认路径指向目录。该函数会跟随符号链接,所以失效的符号链接会返回 False。例如,示例中的 file_path 通过 os.path.exists() 检查,但无法通过 os.path.isdir() 检查。
如果文件或目录任意一种都可以接受,例如在读取文件前检查它是否存在,就可以使用这个函数。如果后续操作要求路径指向目录,应优先使用专门检查目录的函数。另一个进程可能会在检查后、程序使用该路径前更改文件系统,因此检查结果可能过时;它既不能预留该路径,也不能保证后续操作一定成功。
使用 pathlib 检查目录是否存在
pathlib 将路径表示为对象,并提供用于检查路径的方法。要执行与 os.path.isdir() 相同的目录专用检查,请调用 Path.is_dir()。如果文件或目录任意一种都算存在,则调用 Path.exists()。和 os.path.exists() 一样,Path.exists() 会跟随符号链接,并在链接失效时返回 False。示例中的 (root / "archive").exists() 就是在路径对象上使用后一种检查方式。
在一段代码中,尽可能统一使用一种路径风格。如果还需要通过 / 拼接路径组件、创建文件夹,或使用 Path 的方法打开文件,pathlib 会很方便。如果现有 API 或代码库已经传递字符串路径,os.path 函数仍然适用。
如何选择合适的目录检查方式
如果后续操作要求路径指向目录,请选择 os.path.isdir() 或 Path.is_dir()。如果任何已存在的文件系统条目都可以接受,请选择 os.path.exists() 或 Path.exists()。如果需要区分文件和目录,应使用 is_dir(),并在需要时使用 is_file() 明确检查类型,而不要根据路径是否存在来推断类型。
这些函数报告的是检查时能够观察到的文件系统状态。路径可能会在后续读取、写入或创建操作之前发生变化。对于实际执行的操作,也应处理可能出现的错误,尤其是在权限或并发更改可能影响结果时。
目录不存在时创建目录
如果程序需要先有一个目录才能保存文件,可以直接使用 pathlib 创建目录:
本节中的代码以及显示的标签或输出仍为英文。
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as temp_dir:
output_dir = Path(temp_dir) / "reports"
output_dir.mkdir(parents=True, exist_ok=True)
设置 parents=True 后,也会创建缺失的父目录。设置 exist_ok=True 后,如果目标目录已经存在,调用仍会继续。如果目标路径上已有文件,调用仍会失败;权限问题或其他文件系统错误也可能导致失败。因此,这种创建操作适合用作可重复执行的初始化步骤,无须事先单独检查目录是否存在。
如果目录原本是否存在会影响后续行为,可以先用 is_dir() 检查再采取相应操作,但要记住,文件系统可能在这两个操作之间发生变化。如果只是要确保目录可用,mkdir(parents=True, exist_ok=True) 更简洁,也不会把之前的检查误当成保证。