判断文件的几种方法及其优劣对比

2023-10-27

我们知道当⽂件不存在的时候,open()⽅法的写模式与追加模式都会新建⽂件,但是对⽂件进⾏判
我们之前学过,要⽤with语句来处理⽂件读写,但with语句也不是万能的,所以还得关注⼀些异常情况。 例如,当使⽤open()⽅法的时候,如果⽂件不存在,程序会抛出FileNotFoundError异常,⽽如果权限不⾜的话,就会抛出PersmissionError异常。

一.懒人的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'39
为了避免这些异常导致程序中断,我们可以⽤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学习者的⽂件读写指南
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

判断文件的几种方法及其优劣对比 的相关文章

随机推荐

  • java中为什么MAX_ARRAY_SIZE的值为Integer.MAX_VALUE - 8

    数组对象的形状和结构 如int值数组 与标准Java对象类似 主要区别在于数组对象有一个额外的元数据 用于表示数组的大小 数组的最大尺寸为2 31 2147483648 但是需要8bytes的存储大小表示数组的长度等元数据 所以数组的大小定
  • dva 打包多个html,使用dva+umi+antd构建页面(一)

    使用dva umi antd构建页面 首先确保安装npm或者yarnhtml 建立新应用 首先建立应用目录node mkdir myapp cd myapp 推荐使用 yarn 建立应用 执行如下命令 react 若是你坚持用 npm 可执
  • HJ77火车进站

    思路 重复的子问题 每一次车进站可以选择 出 还是 不出 解决重复子问题 动规 or 深搜 此题 输出具体 方案 显然动规不符合 因此选择深搜 注意 除了维护数组 还需要维护一个栈结构 代码 include
  • 基于xxx的系统实现

    2 基于强化学习的Tic Tac To实现 3 基于文本的关键词打标 4 基于自然语言处理的情感分析系统 5 基于深度学习的语音识别系统 6 基于深度学习的人脸识别系统 7 随机森林的多分类问题研究 8 回归算法预测系统 9 决策树算法的分
  • 数据通信加密与防篡改及数字证书原理详解

    1 安全五要素 一般而言 同时满足了机密性 信息不被泄露或泄露后对别人来说并没实际价值 完整性 信息不被非法篡改或被篡改后可以检测到 和身份验证 和自己通信的人确实就是我认为和我正在通信的人 就可以认为是安全通信了 安全通信需要满足如下五点
  • QT中通过网络发送QImage的解决方案

    服务端 QImage img img load path QByteArray ba QDataStream ds ba QIODevice WriteOnly 将图片读入array 方便发送 ds lt
  • 二进制文件如何使用Notepad读取显示

    1 下载安装notepad 2 打开notepad 点击插件 plugins gt 插件管理 3 安装hex editor 滑动滚动条 找到hex editor 点击右上角安装 注 安装完后需要重启notepad 4 选择二进制文件后 右击
  • Linux线程互斥与同步

    目录 进程线程间的互斥相关背景概念 互斥和原子性 互斥量mutex 互斥量实现原理探究 锁是否需要被保护 如何保证申请锁的过程是原子的 可重入VS线程安全 Linux线程同步 条件变量 销毁条件变量 唤醒等待 进程线程间的互斥相关背景概念
  • 什么是抽象类

    抽象概念 当我们在做子类共性功能抽取时 有些方法在父类中并没有具体的体现 这个时候就需要抽象类了 在Java中 一个没有方法体的方法应该定义为抽象方法 而类中如果有抽象方法 该类必须定义为抽象类 抽象方法 没有方法体的方法 抽象类 包含抽象
  • Unity层级

    层级 层级是Unity中场景物体的一种属性 摄像机可以指明渲染层级以渲染场景中的部分物体 灯光可以指明照射层级以照亮部分物体 可以指定照亮某些层级的物体以显示阴影 层级还能用于设置物理碰撞关系 层级顺序 Unity中的渲染顺序自上而下大致分
  • 关于 Math.random()生成指定范围内的随机数的公式推导

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • 用VS2015编译QGIS3.16.9源码

    TOC VS2015编译QGIS3 16 9源码 编译QGIS源码 由于编译QGIS时涉及依赖的开源库很多 过程比较麻烦 特在此记录编译的完整过程 以方便同道中人参考 同时也方便本人以后编译忘记步骤时回头看看 接下来就开干 一 VS2015
  • c语言输出txt文件不对齐,用fprintf函数打印同样的内容,样子不同。百度无解,望大佬帮忙...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这是我的全部代码 功能是实现随机生成20个20以内的不重复的加减法 如果大佬们对我的代码思路和代码风格有什么建议 也希望能不吝赐教 include include include define
  • CSDN高校俱乐部2012年秋季巡讲安排及讲师介绍

    CSDN高校俱乐部2012年秋季巡讲行程在各位讲师 主席和指导教师的给力支持下已初步出炉 部分学校仍需要确认时间安排 大多数学校已确定巡讲时间 时间表列在下方 讲师介绍在最后 阵容强大值得期待 学校名单及安排 场序 地区 城市 分组 学校
  • SpringMVC视图解析器

    SpringMVC视图解析器 SpringMVC中的视图解析器的主要作用就是将逻辑视图转换成用户可以看到的物理视图 当用户对SpringMVC应用程序发起请求时 这些请求都会被SpringMVC的DispatcherServlet处理 通过
  • Xcode 调试之 Hello World

    编译 编译JKD 可以查看 Mac 编译 OpenJDK 8 调试 截图来自 https segmentfault com a 1190000005082098 调试 Hello World 编写好源文件 public class Hell
  • Linux命令行另类使用技巧

    0x00 基础简述 0x01 补全实践 bash completion zsh autosuggestions 文件名补全 特殊补全 命令行参数补齐 可编程补全 0x02 历史命令 设置历史记录 查看历史命令 搜索历史命令 前后移动历史命令
  • CSS层叠性(重要)

    CSS层叠性 重要 指多种CSS样式的叠加 是浏览器处理冲突的一个能力 如果一个属性通过两个相同选择器设置到同一个元素上 那么这个时候一个属性就会将另一个属性层叠掉 原则 1 样式冲突 遵循的原则是就近原则 即CSS的书写位置 2 样式不冲
  • 【2022年MathorCup大数据竞赛】B题:北京移动用户体验影响因素研究(一)

    目录 一 题目背景 二 初赛问题 三 数据集的分享 一 题目背景 移动通信技术飞速发展 给人们带来了极大便利 人们也越来越离不开移动通信技术带来的各种便捷 随着网络不断的建设 网络覆盖越来越完善 各个移动运营商 越来越重视客户的网络使用体验
  • 判断文件的几种方法及其优劣对比

    目录 一 懒人的try语句 二 传统的os模块 三 时尚的pathlib模块 四 几种方法优劣对比 我们知道当 件不存在的时候 open 法的写模式与追加模式都会新建 件 但是对 件进 判 我们之前学过 要 with语句来处理 件读写 但w