在 Python 中检查文件或文件夹是否存在的 7 种方法
已发表: 2021-06-16Python 标准库包含开发人员解决问题所需的大部分功能。 在本教程中,您将学习仅使用内置模块检查文件或目录是否存在的不同方法。
检查文件或脚本是否位于正确的位置对于任何 CLI 程序都至关重要。 如果特定文件在执行时不在位,您的程序可能会变得无用。
在今天的教程中,您将学习一些在 Python 中检查文件或文件夹是否存在的快速方法。
在开始之前
在执行以下任何命令之前,请确保您的系统中安装了 Python 3。 打开终端并输入以下命令:
python --version # Python 3.9.5, my result如果您有 2.x 版本,则需要使用“python3”命令。 如果您没有安装 Python 3,请查看我们的 Python 安装指南。
我们将在本教程中使用一些测试文件,因此请确保创建以下文件:
touch testfile.txt mkdir testdirectory/ touch testdirectory/otherfile.txt上面的命令创建了一个文件,一个 testing 目录,以及testingdirectory 中的另一个文件。 这些文件可以是空的,因为我们不需要读取它们的内容,
注意:如果您使用的是 Windows,请使用图形文件管理器设置该文件的简单文件结构。
最后,我们将使用 Ipython 作为我们的交互式 Python shell,它提供了一个漂亮的界面来使用。 这只是一种商品,因此不是绝对必要的。
pip install ipython完成此操作后,您只需键入ipython即可访问漂亮的 Python shell。

现在你已经准备好了,让我们深入研究检查 Python 中是否存在文件夹或文件的方法。
尝试、打开和除外
这是最直接的选择。 如果您尝试打开一个不存在的文件,Python 将引发 FileNotFoundError。
In [1]: open('im-not-here.txt') --------------------------------------------------------------------------- FileNotFoundError: [Errno 2] No such file or directory: 'im-not-here.txt'我们可以利用这一点,并在我们要查找的文件不存在的情况下处理异常。
In [2]: try: ...: file = open('im-not-here.txt') ...: print(file) # File handler ...: file.close() ...: except FileNotFoundError: ...: print('Sorry the file we\'re looking for doesn\' exist') ...: exit() ...: Sorry the file we're looking for doesn't exist在上面的代码中,我们打印自定义消息并在文件不存在时停止程序的执行。
请注意exit()函数如何仅在引发异常时执行。 让我们看看当我们要查找的文件实际存在时会发生什么。
In [2]: try: ...: file = open('testfile.txt') ...: print(file) # File handler ...: file.close() ...: except FileNotFoundError: ...: print('Sorry the file we\'re looking for doesn\'t exist') ...: exit() ...: <_io.TextIOWrapper name='testfile.txt' mode='r' encoding='UTF-8'>请注意我们是如何在打开文件后立即关闭它的。 根据 Python 文档,这被认为是一种很好的做法。
调用
<span class="pre">file.write()</span>而不使用<span class="pre">with</span>关键字或调用<span class="pre">file.close()</span>可能会导致<span class="pre">file.write()</span>没有完全写入磁盘,即使程序成功退出。
即使我们不写入文件,也强烈建议关闭文件,因为这可能会导致多个性能问题。
如果我们不想自己关闭文件,我们可以使用with上下文管理器。 它精确地分配和释放资源,因此我们不需要关闭文件。
In [3]: try: ...: with open('testfile.txt') as file: ...: print(file) ...: # No need to close the file ...: except FileNotFoundError: ...: print('Sorry the file we\'re looking for doesn\'t exist') ...: exit() ...: ...: <_io.TextIOWrapper name='testfile.txt' mode='r' encoding='UTF-8'>这种方法在写入文件时非常有用,但如果我们只想检查文件是否存在,则会导致效率低下。 让我们深入研究实现这一目标的其他选项。
os.path.exists()
os 模块提供了多种与操作系统交互的功能。 要检查文件或文件夹是否存在,我们可以使用路径。 exists()函数接受文件或目录的路径作为参数。 它根据路径的存在返回一个布尔值。
注意:路径是文件或目录在文件系统中的唯一位置
在 Python 中, os.path 子模块包含专门设计用于处理文件路径的函数。 所有这些函数都接受作为字符串或字节的路径参数,您可以决定使用绝对路径,例如:
/home/daniel/.bashrc或者使用相对路径,具体取决于您运行脚本的目录:
.bashrc # Running the script in my home folder以下是使用os.path.exists()函数的多个示例,在我的测试文件所在的目录中运行:
In [1]: import os In [2]: os.path.exists('testfile.txt') Out[2]: True In [3]: os.path.exists('testdirectory') Out[3]: True In [4]: os.path.exists('hey-i-dont-exist') Out[4]: False如您所见,当使用testfile.txt文件和testdirectory文件夹进行测试时,它返回True ,当文件不存在时返回False 。
os.path.isfile()
如果您只想证明文件(而不是目录)的存在,则可以调用os.path.isfile()函数。
In [1]: import os In [2]: os.path.isfile('testfile.txt') Out[2]: True In [3]: os.path.isfile('testdirectory/') Out[3]: False In [4]: os.path.isfile('i-dont-even-exist') Out[4]: False In [5]: os.path.isfile('testdirectory/otherfile.txt') Out[5]: True注意:在 UNIX 中,所有目录都以正斜杠 (/) 结尾,而在 Windows 中,我们使用反斜杠 (\)。

在上面的代码中, isfile()函数有两次返回False ,让我们看看为什么:
-
testdirectory/是一个目录,因此它不被视为文件。 这不是绝对正确的,因为在 Linux 中一切都是文件描述符,但 Python 只是为了方便而以不同的方式对待目录(如果您尝试打开目录,您将收到IsADirectoryError ) -
i-dont-even-exist指向一个具有讽刺意味的不存在的文件
os.path.isdir()
如果你想检查一个目录是否在正确的位置,你需要使用os.path.isdir()函数,如果给定的路径指向一个目录,它只会返回True 。
In [1]: import os In [2]: os.path.isdir('testfile.txt') Out[2]: False In [3]: os.path.isdir('testdirectory') Out[3]: True In [4]: os.path.isdir('anotherfile.txt') Out[4]: False请注意上面的示例如何即使路径指向存在的文件也返回False 。
球体
glob 模块提供了使用类 Unix shell 模式的函数(因此它不能在 Windows 上正常工作)。 要检查文件是否与当前目录中的模式匹配,您可以使用 glob.glob() 函数。
In [1]: import glob In [2]: glob.glob('testfile.txt') Out[2]: ['testfile.txt'] In [3]: glob.glob('testdirectory') Out[3]: ['testdirectory']在上面的代码中,传递给 glob 函数的模式是一个普通字符串,表示测试文件和目录的路径。 由于两个路径都存在,该函数返回一个列表,其中包含匹配的路径名。
注意:如果模式不匹配,您将得到一个空列表。
考虑到我们可以将模式传递给 glob 函数,为什么不测试它的一些主要优点呢?
下面的代码分别获取扩展名为.txt和.py 的所有文件路径:
In [4]: glob.glob('*.txt') Out[4]: ['testfile.txt'] In [5]: glob.glob('*.py') Out[5]: ['pathlib-exists.py', 'list-dir.py', 'glob-file.py', 'open-except.py', 'subprocess-test.py', 'isfile.py', 'exists.py', 'isdir.py']使用路径类
Path 类是处理路径的最佳方法之一,因为它为我们提供了一个干净的界面来将文件路径作为对象进行处理。
蛋糕的樱桃是 Path 实例具有获取有关特定路径的信息所需的所有方法。 这包括与先前选项类似的功能。
注意:您需要 Python 3.4 或更高版本才能使用 pathlib 库
您将使用的 Path 方法:
- 路径()。存在()
- 路径().is_file()
- 路径().is_dir()
检查路径是否存在
In [1]: from pathlib import Path In [2]: Path('testfile.txt').exists() Out[2]: True In [3]: Path('im-not-here.txt').exists() Out[3]: False In [4]: Path('testdirectory').exists() Out[4]: True与os.path.exists() 的工作原理相同。
检查路径是否指向文件
In [5]: Path('testfile.txt').is_file() Out[5]: True In [6]: Path('testdirectory').is_file() Out[6]: False相当于os.path.isfile() 。
检查路径是否指向目录
In [7]: Path('testfile.txt').is_dir() Out[7]: False In [8]: Path('testdirectory').is_dir() Out[8]: True对应于os.path.isdir()。
子流程
如果您是子流程模块爱好者,则需要了解此选项。 您可以使用 test 命令确定文件或文件夹是否存在。
注意: test命令仅在 Unix 中有效。
以下测试标志将完成工作:
- test -e:检查路径是否存在
- test -f:检查文件是否存在
- test-d:检查文件夹是否存在
如果您想深入了解更多测试标志,可以通过运行以下命令阅读手册:
man test使用子进程检查路径:
下面的代码通过将子进程的返回码与 0 进行比较来确定路径是否存在。
请记住,在 Linux 中,如果进程运行良好,它将返回零,否则将返回任何其他代码。
In [1]: from subprocess import run In [2]: run(['test', '-e', 'testfile.txt']).returncode == 0 Out[2]: True In [3]: run(['test', '-e', 'im-not-here.txt']).returncode == 0 Out[3]: False在第一条语句中,我们导入 subprocess 模块,然后使用 run 函数并获取其返回码。
使用子进程验证文件的存在
In [4]: run(['test', '-f', 'testfile.txt']).returncode == 0 Out[4]: True In [5]: run(['test', '-f', 'testdirectory']).returncode == 0 Out[5]: False使用子进程检查目录:
In [6]: run(['test', '-d', 'testfile.txt']).returncode == 0 Out[6]: False In [7]: run(['test', '-d', 'testdirectory']).returncode == 0 Out[7]: True不建议使用此选项,因为它会消耗更多资源,而且我们不会从中获得任何优势。
总结
Python 是最常用的编程语言之一,通过与操作系统交互来自动化流程。 您可以用它做的一件很酷的事情是检查文件或文件夹是否存在。
最直接的做法是:
- 立即打开和处理文件异常
- 使用os.path或pathlib模块的exists()函数。
在本教程中,您学习了:
- 如果文件不存在,如何打开文件并处理异常
- 路径的含义
- os.path子模块提供了 3 个不同的函数来检查文件或文件夹的存在
- Unix 使用正斜杠 (/),而 Windows 使用反斜杠 (\)
下一篇:Python 中的子进程是什么? [5 用法示例]
