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 当作路径不存在的证据。如果需要报告路径类型或据此分支处理,就先检查;如果现在就要读取文件,则直接打开。