在 Python 中检查文件或文件夹是否存在的 7 种方法

Python 标准库包含开发人员解决问题所需的大部分功能。 在本教程中,您将学习仅使用内置模块检查文件或目录是否存在的不同方法。

检查文件或脚本是否位于正确位置对于任何 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

上面的命令创建一个要使用的文件、一个测试目录和测试目录中的另一个文件。 这些文件可以是空的,因为我们不需要阅读它们的内容,

注意:如果您使用的是 Windows,请使用图形文件管理器设置该文件的简单文件结构。

最后,我们将使用 Ipython 作为我们的交互式 Python shell,它提供了一个漂亮的界面来使用。 这只是一种商品,因此不是绝对必要的。

pip install ipython

完成此操作后,只需键入 ipython 即可访问漂亮的 Python shell。

现在一切就绪,让我们深入探讨在 Python 中检查文件夹或文件是否存在的方法。

尝试、打开和排除

这是最直接的选择。 如果你试图打开一个不存在的文件,Python 会抛出一个 文件未找到错误.

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 文档.

  前 50 个 VMware NSX 面试问题和答案

调用 file.write() 而不使用 with 关键字或调用 file.close() 可能导致 file.write() 的参数没有被完全写入磁盘,即使程序成功退出也是如此。

即使我们不写入文件,也强烈建议关闭文件,因为它可能会导致 多重性能问题.

如果我们不想自己关闭文件,我们可以使用 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.存在()

操作系统模块 提供多种功能与操作系统交互。 要检查文件或文件夹是否存在,我们可以使用 path.exists() 函数,该函数接受文件或目录的路径作为参数。 它根据路径的存在返回一个布尔值。

注意:路径是文件或目录在文件系统中的唯一位置

在 Python 中, 操作系统路径 子模块包含专为处理文件路径而设计的函数。 所有这些函数都接受字符串或字节形式的路径参数,您可以决定使用绝对路径,例如:

/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 的。

全球

球体 模块提供了可以使用的功能 类 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 实例具有获取有关特定路径的信息所需的所有方法。 这包括与先前选项类似的功能。

注意:您需要 Python 3.4 或更高版本才能使用 pathlib 库

  如何为音频和视频生成字幕? [9 Best Tools]

您将使用的 Path 方法:

检查路径是否存在

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()。

子进程

如果您是子流程模块爱好者,则需要了解此选项。 您可以使用 测试命令.

注意:测试命令仅适用于 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 模块,然后使用 运行函数 并获取其返回码。

使用子进程验证文件是否存在

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 Usage Examples]