再谈文件读写:判断文件的几种方法及其优劣对比
off999 2024-10-12 06:18 53 浏览 0 评论
上周,猫猫写了一篇给Python学习者的文件读写指南,跟大家一起详尽地学习了文件读写的基础内容,以及with语句与上下文管理器的进阶知识。
这份指南虽然写得很用心,但是因为只关注了文件读写的核心内容,所以也有美中不足不处,有些在实战中所需的知识点没有谈到,例如,为了能够进行文件读写,首先得找到文件、文件得可读写才行。
我们知道当文件不存在的时候,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就会胜出一筹。
喵喵,今天的分享就到这啦,小伙伴们觉得有用的话,麻烦帮忙点赞、转发给其他童靴哦~~~
另外,为了回馈各位好学的胖友们,猫猫精选了20本电子书,现在去后台回复【爱学习】,即可免费获得哦喵~~~
扩展阅读:
给Python学习者的文件读写指南
https://mp.weixin.qq.com/s/Md07VoaULda7qnMO4ob7Ww
菜鸟教程:os模块
http://www.runoob.com/python/os-file-methods.html
官方文档:pathlib模块
https://docs.python.org/3/library/pathlib.html
相关推荐
- 面试官:来,讲一下枚举类型在开发时中实际应用场景!
-
一.基本介绍枚举是JDK1.5新增的数据类型,使用枚举我们可以很好的描述一些特定的业务场景,比如一年中的春、夏、秋、冬,还有每周的周一到周天,还有各种颜色,以及可以用它来描述一些状态信息,比如错...
- 一日一技:11个基本Python技巧和窍门
-
1.两个数字的交换.x,y=10,20print(x,y)x,y=y,xprint(x,y)输出:102020102.Python字符串取反a="Ge...
- Python Enum 技巧,让代码更简洁、更安全、更易维护
-
如果你是一名Python开发人员,你很可能使用过enum.Enum来创建可读性和可维护性代码。今天发现一个强大的技巧,可以让Enum的境界更进一层,这个技巧不仅能提高可读性,还能以最小的代价增...
- Python元组编程指导教程(python元组的概念)
-
1.元组基础概念1.1什么是元组元组(Tuple)是Python中一种不可变的序列类型,用于存储多个有序的元素。元组与列表(list)类似,但元组一旦创建就不能修改(不可变),这使得元组在某些场景...
- 你可能不知道的实用 Python 功能(python有哪些用)
-
1.超越文件处理的内容管理器大多数开发人员都熟悉使用with语句进行文件操作:withopen('file.txt','r')asfile:co...
- Python 2至3.13新特性总结(python 3.10新特性)
-
以下是Python2到Python3.13的主要新特性总结,按版本分类整理:Python2到Python3的重大变化Python3是一个不向后兼容的版本,主要改进包括:pri...
- Python中for循环访问索引值的方法
-
技术背景在Python编程中,我们经常需要在循环中访问元素的索引值。例如,在处理列表、元组等可迭代对象时,除了要获取元素本身,还需要知道元素的位置。Python提供了多种方式来实现这一需求,下面将详细...
- Python enumerate核心应用解析:索引遍历的高效实践方案
-
喜欢的条友记得关注、点赞、转发、收藏,你们的支持就是我最大的动力源泉。根据GitHub代码分析统计,使用enumerate替代range(len())写法可减少38%的索引错误概率。本文通过12个生产...
- Python入门到脱坑经典案例—列表去重
-
列表去重是Python编程中常见的操作,下面我将介绍多种实现列表去重的方法,从基础到进阶,帮助初学者全面掌握这一技能。方法一:使用集合(set)去重(最简单)pythondefremove_dupl...
- Python枚举类工程实践:常量管理的标准化解决方案
-
本文通过7个生产案例,系统解析枚举类在工程实践中的应用,覆盖状态管理、配置选项、错误代码等场景,适用于Web服务开发、自动化测试及系统集成领域。一、基础概念与语法演进1.1传统常量与枚举类对比#传...
- 让Python枚举更强大!教你玩转Enum扩展
-
为什么你需要关注Enum?在日常开发中,你是否经常遇到这样的代码?ifstatus==1:print("开始处理")elifstatus==2:pri...
- Python枚举(Enum)技巧,你值得了解
-
枚举(Enum)提供了更清晰、结构化的方式来定义常量。通过为枚举添加行为、自动分配值和存储额外数据,可以提升代码的可读性、可维护性,并与数据库结合使用时,使用字符串代替数字能简化调试和查询。Pytho...
- 78行Python代码帮你复现微信撤回消息!
-
来源:悟空智能科技本文约700字,建议阅读5分钟。本文基于python的微信开源库itchat,教你如何收集私聊撤回的信息。[导读]Python曾经对我说:"时日不多,赶紧用Python"。于是看...
- 登录人人都是产品经理即可获得以下权益
-
文章介绍如何利用Cursor自动开发Playwright网页自动化脚本,实现从选题、写文、生图的全流程自动化,并将其打包成API供工作流调用,提高工作效率。虽然我前面文章介绍了很多AI工作流,但它们...
- Python常用小知识-第二弹(python常用方法总结)
-
一、Python中使用JsonPath提取字典中的值JsonPath是解析Json字符串用的,如果有一个多层嵌套的复杂字典,想要根据key和下标来批量提取value,这是比较困难的,使用jsonpat...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python自定义函数 (53)
- python进度条 (67)
- python吧 (67)
- python字典遍历 (54)
- python的for循环 (65)
- python格式化字符串 (61)
- python串口编程 (60)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python字典增加键值对 (53)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python人脸识别 (54)
- python多态 (60)
- python命令行参数 (53)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)