共计 2990 个字符,预计需要花费 8 分钟才能阅读完成。
咱们晓得当文件不存在的时候,open()办法的写模式与追加模式都会新建文件,然而对文件进行判断的场景还有很多,比方,在爬虫下载图片的时候,可能须要判断文件是否存在,免得反复下载;又比方,创立新文件的时候,可能须要判断文件是否存在,存在就先做个备份……所以,学习判断文件是否存在,还是很有必要的。
学习是循序渐进的过程,若能建设知识点间的分割,进行系统性的学习,那将更有助于成果。浏览这篇文章,你将读到如下内容:
1、判断文件的办法(try 语句、os 模块、pathlib 模块)
2、以上几种办法的优劣比照
懒人的 try 语句
咱们之前学过,要用 with 语句来解决文件读写,但 with 语句也不是万能的,所以还得关注一些异常情况。
例如,当应用 open()办法的时候,如果文件不存在,程序会抛出 FileNotFoundError 异样,而如果权限有余的话,就会抛出 PersmissionError 异样。
with open("python.log", "r") as f:
...: f.read()
-----------------------
...(略)
FileNotFoundError: [Errno 2] No such file or directory: 'python.log'
为了防止这些异样导致程序中断,咱们能够用 try…except…语句来捕获异样,而后在 except 子句进行异样的解决。
不过,在猫猫看来,这个办法不值得举荐。起因有二,一是这种办法很被动,程序的衰弱受制于不可预测的异样;二是当文件不存在的时候,咱们可能须要去创立文件,这些逻辑如果写在 except 子句里,可读性太差了。
传统的 os 模块
顾名思义,Python 内置的 os 模块是用来与 OS(操作系统)进行交互的模块,它能够实现很多在命令行下做的操作,例如,获取操作系统信息、获取 / 批改环境变量、进行目录操作(创立、删除、遍历)和各种文件操作等等。上面,咱们要学习的是跟文件判断密切相关的几个办法。
1、os.path.exists()用于判断文件及文件夹是否存在(留神:因为两者都能判断,为了无效辨别文件和文件夹,最好保障文件名是带后缀的):
import os
# 文件存在 VS 不存在
os.path.exists("test.txt") >>>True
os.path.exists("cat.txt") >>>False
# 文件夹存在 VS 不存在
os.path.exists("cat/images") >>>True
os.path.exists("cat/image") >>>False
2、os.path.isfile()、os.path.isdir() 判断给定的门路是文件还是文件夹:
os.path.isfile("cat/images") >>>False
os.path.isdir("cat/images") >>>True
os.path.isfile("test.txt") >>>True
3、os.access()检测文件门路的拜访权限,语法:os.access(path, mode);其中 path 指的是文件或者文件夹,mode 指的是要检测的模式:
os.access("cat/images", os.F_OK) >>>True # path 存在
os.access("cat/images", os.R_OK) >>>True # path 可读
os.access("cat/images", os.W_OK) >>>True # path 可写
os.access("cat/images", os.X_OK) >>>True # path 可执行
4、os 模块中其它罕用办法:
os.mkdir()创立目录、os.rmdir()删除目录、os.rename()重命名、os.remove()删除文件、os.path.join()连贯目录与文件名、os.path.split()宰割目录与文件名……(不一一举例了,今后有机会再作介绍)
时尚的 pathlib 模块
pathlib 模块是 python3.4 才退出的模块,官网介绍它是面向对象的文件系统门路(Object-oriented filesystem paths),这是一个很弱小的模块,文末附录了官网文档地址。
这里次要介绍几个根本的用法:
import pathlib
file_obj = pathlib.Path("test.txt")
file_obj.name >>>'test.txt' # 文件名
file_obj.exists() >>> True # 是否存在
file_obj.is_dir() >>>False # 是否文件夹
file_obj.is_file() >>>True # 是否文件
几种办法优劣比照
围绕文件操作的常识很多,限于篇幅,本文次要对判断文件作了介绍,今后兴许还会对其它具体话题进行学习。
当初晓得了几种判断文件是否存在的办法,猫猫试着依据本人的了解,对它们做一下评判。
首先,try 语句的毛病是没有被动做判断,不不便依据文件是否存在而做针对性的解决,它把必要的逻辑交给异样捕捉,多少显得“不负责任”;try 语句也有长处,一是不须要引入模块,不须要辨别各种应用办法,二是将其它可能存在的异样都打包,防止多零碎或者多场景的脱漏。
os 模块是传统的老模块了,在应用上和保护上都会比拟顺畅;它的次要毛病在于有的办法比拟繁琐,比方因为应用字符串来示意文件门路,这会导致门路拼接上的麻烦。另外,不同操作系统在门路分隔符上的差别(Windows 应用 \ 分隔符,Linux 和 Mac 应用 / 分隔符),也可能导致难以发现的谬误。
相对来说,pathlib 性能最弱小,但遍及度比拟低,有肯定的学习门槛;它次要的长处是面向对象,同时,因为对不同操作系统的个性做了封装,能无效防止字符串示意文件门路的难题。它也有不足之处,即没有像 os.access()这种能够检测拜访权限的办法,尽管这个办法根本不会应用到。
上面比拟了三种拼接文件门路的办法,办法一未对分隔符做解决,不能保障在每个操作系统都能找到;办法二须要重复应用 os.path.join;办法三只用“/” 就能拼接门路,而且必定反对多操作系统。
# 谬误拼接:未解决分隔符
data_folder = "source_data/text_files/"
file_to_open = data_folder + "test.txt"
# os 模块拼接
import os
data_folder = os.path.join("source_data", "text_files")
file_to_open = os.path.join(data_folder, "test.txt")
# pathlib 模块拼接
from pathlib import Path
data_folder = Path("source_data/text_files/")
file_to_open = data_folder / "test.txt"
总结一下,如果文件门路简略,仅仅要用到 exists()、is_dir()、is_file() 这几个办法的话,os.path 模块和 pathlib.Path 模块不分伯仲,都很好用,然而如果思考到简约的门路拼接的话,pathlib.Path 就会胜出一筹。
以上就是本次分享的所有内容,想要理解更多 python 常识欢送返回公众号:Python 编程学习圈,发送“J”即可收费获取,每日干货分享