Python如何判断文件是否存在?


运行环境 Runtime environment

1
2
3
操作系统: Windos10  
IDE: pycharm 2021.3.1 x64
语言: python v3.9.1

背景

平时在读写文件之前,需要判断文件或目录是否存在,不然在某些情况下,可能会使程序发生错误。

所以最好在做任何操作之前,先判断文件是否存在。

按照使用频率,排个序大概有以下几种方式。

os模块

os模块中的 os.path.exists() 方法用于检验文件或者文件夹是否存在。

判断文件是否存在

1
2
3
4
5
6
7
import os
os.path.exists("README.md")
# 输出 True

# 放入根本不存在的文件名时
os.path.exists("README_XXXXX.md")
# 输出 False

判断文件夹是否存在

1
2
3
4
5
6
7
import os
os.path.exists("test_dir")
#True

# 放入根本不存在的文件夹名称
os.path.exists("None_dir")
#False

注意

os.path.exists() 存在误判,

假设你想检查文件“test_data”是否存在,

但是当前路径下有个叫“test_data”的文件夹,

这样就可能出现误判。

所以,就多一层逻辑,用于检查是否为文件。

1
2
3
4
5
6
7
import os
os.path.isfile("README.md")
# 输出 True

# 放入的是文件夹则
os.path.isfile("test_dir")
# 输出 False

通过这个方法,如果文件”test_dir”不存在将返回False,

反之返回True。

即是文件存在,你可能还需要判断文件是否可进行读写操作。

判断文件是否有读写权限

使用os.access()方法判断文件是否可进行读写操作

语法:

os.access(path, mode)

path为文件路径,传入参数类型为字符串,mode为操作模式,

有这么几种:

os.F_OK: 检查文件是否存在;

os.R_OK: 检查文件是否可读;

os.W_OK: 检查文件是否可以写入;

os.X_OK: 检查文件是否可以执行

该方法通过判断文件路径是否存在和各种访问模式的权限,

返回True或者False。

1
2
3
4
5
6
7
8
9
10
11
12
import os
if os.access("/file/path/foo.txt", os.F_OK):
print("Given file path is exist.")

if os.access("/file/path/foo.txt", os.R_OK):
print("File is accessible to read")

if os.access("/file/path/foo.txt", os.W_OK):
print("File is accessible to write")

if os.access("/file/path/foo.txt", os.X_OK):
print("File is accessible to execute")

Try异常抓取判断

可以在程序中直接使用open()方法来检查文件是否存在和可读写。

语法:

open() or with open()

如果你open的文件不存在,程序会抛出错误,

使用try语句来捕获这个错误。

程序无法访问文件,可能有很多原因:

如果你open的文件不存在,将抛出一个FileNotFoundError的异常;

文件存在,但是没有权限访问,会抛出一个PersmissionError的异常。

通过异常名称的特点,便可以使用下面的代码来判断文件是否存在:

1
2
3
4
5
6
7
8
9
try:
f =open()
f.close()
except FileNotFoundError:
print ("File is not found.")
except PermissionError:
print"You don't have permission to access this file.")
except IOError:
print("File is not accessible.")

IOError 异常的抓取范围较大,一般放在最后,只要抓到保存,基本说明文件不存在或者不可用了。

pathlib模块

pathlib模块在Python3版本中是内建模块,

但是在Python2中是需要单独安装三方模块。

使用pathlib需要先使用文件路径来创建path对象。

此路径可以是文件名或目录路径。

检查路径是否存在

1
2
path = pathlib.Path("path/file")
path.exist()

检查路径是否是文件

1
2
path = pathlib.Path("path/file")
path.is_file()

与OS模块的用法类似。

总结

这其实是个很简单的东西,

平时开发的时候,

你也许知道有那么个方法可以去实现这样的功能,

但是,却不一定记得住具体的方法名叫啥,

于是就有需要重新查一下。

那么干脆在自己的博客,留个笔记好了。