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 文档.
调用 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 库
您将使用的 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]