HOWTO · Python

Python 如何检查某文件是否存在

本文介绍了 Python 中如何检查某文件是否存在。

本页内容

当后续操作要求路径指向文件而非目录时,检查它是否为常规文件会很有用。对于 pathlib 路径,可使用 Path.is_file()。它会返回布尔值,并跟随指向常规文件的符号链接。检查结果只是某一时刻的状态:路径可能在后续操作前发生变化,因此准备使用文件时应直接打开它。

快速回答:检查路径是否指向文件

运行下面的示例,检查程序创建的常规文件:

本节中的代码以及显示的标签或输出仍为英文。

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as folder:
    path = Path(folder) / "notes.txt"
    path.write_text("Hello, Python!", encoding="utf-8")
    print(path.is_file())

临时目录让示例能够独立运行。如果要确认路径是否指向常规文件,Path.is_file() 是最明确的选择。路径指向常规文件时,结果为 True;路径不存在、指向目录,或无法确认为常规文件时,结果为 False。

使用 pathlib.Path.is_file()

pathlib 会将文件系统路径表示为 Path 对象,因此这个方法适用于已经使用 pathlib 的代码。可以从字符串创建路径,也可以用 / 将目录路径与文件名组合起来,然后调用 is_file():

本节中的代码以及显示的标签或输出仍为英文。

from pathlib import Path

path = Path("reports") / "summary.txt"
if path.is_file():
    print("A regular file is available.")

这段代码展示了如何检查路径,并未假设读者的环境中一定存在 reports/summary.txt。它不会打开或读取文件。文件系统权限或操作系统错误可能影响检查能够确认的内容,因此不要把 False 结果当作访问失败原因的诊断。

使用 os.path.isfile()

对于使用 os.path 的代码,可以将路径传给它的 isfile() 函数。它与 Path.is_file() 一样,用于检查路径是否指向常规文件:

本节中的代码以及显示的标签或输出仍为英文。

import os

path = os.path.join("reports", "summary.txt")
if os.path.isfile(path):
    print("A regular file is available.")

os.path.isfile() 是一个函数,而 Path.is_file() 是 Path 对象的方法。根据周围代码选择合适的写法即可;两者都能区分常规文件与目录。

目录也算存在时选择 exists()

如果只需确认路径是否存在,不论它指向文件还是目录,都可以使用 Path.exists() 或 os.path.exists()。路径指向目录时,两者也可能返回 True,因此它们的检查范围比常规文件检查更广。例如,如果 reports 位置上的文件或目录都可以接受,就使用 Path("reports").exists();如果只接受常规文件,就使用 Path("reports").is_file()。

这些检查不能保证后续读取或写入一定成功。检查后路径可能发生变化,而且路径存在并不代表当前进程有权限使用它。如果真正重要的是执行操作本身,就直接执行该操作并处理相关错误。

准备使用文件时直接打开

如果下一步就是读取文件,直接打开可以避免依赖可能已经过时的检查结果。只有在需要处理路径不存在的情况时,才捕获 FileNotFoundError;权限错误和其他 I/O 错误应保持可见,或根据应用程序的需要分别处理:

本节中的代码以及显示的标签或输出仍为英文。

from pathlib import Path

path = Path("settings.json")
try:
    with path.open(encoding="utf-8") as file:
        contents = file.read()
except FileNotFoundError:
    contents = None

if contents is None:
    print("The settings file is missing.")
else:
    print("The settings file was read.")

这种写法会尝试执行预期的读取,并专门处理路径不存在的情况。它不会把 PermissionError 或其他 OSError 当作路径不存在的证据。如果需要报告路径类型或据此分支处理,就先检查;如果现在就要读取文件,则直接打开。