使用Python判断一个文件是否被占用的方法教程


Posted in Python onDecember 16, 2020

今天有同学问,用os模块的access()能否判断一个文件是否被占用?直觉上,这是行不通的,因为access()返回的是文件的读写属性。为了确认这一点,我简单测试了一下。

>>> import os
>>> fn = r'D:\temp\csdn\t.py' # 测试用的文件
>>> os.access(fn, os.F_OK) # 文件是否存在
True
>>> os.access(fn, os.R_OK) # 文件是否可读
True
>>> os.access(fn, os.W_OK) # 文件是否可写
True
>>> os.access(fn, os.X_OK) # 文件是否可执行
True
>>> fp = open(fn, 'a+') # 以追加写的方式打开文件
>>> os.access(fn, os.F_OK) # 文件当然还在
True
>>> os.access(fn, os.R_OK) # 文件依然可读
True
>>> os.access(fn, os.W_OK) # 文件依然可写
True
>>> os.access(fn, os.X_OK) # 文件依然执行
True
>>> fp.close()

可见,os.access()返回的是文件读写属性,与文件是否被占用没有半毛钱关系。

后来,群里有同学建议说,不妨用try尝试着open文件,如果成功,表示文件没有被占用,如果抛出异常,则表示文件被占用。果真如此吗?还是用代码验证一下吧。

>>> fp1 = open(fn, 'a+')
>>> fp2 = open(fn, 'a+')
>>> fp1.close()
>>> fp2.close()

结果表明,对同一个文件以写的方式打开多次,系统并没有抛出异常。为什么会这样呢?究其原因,是因为文件被打开和文件被占用是完全两个不同的问题。顺便提醒一下,做上面的测试时,不要使用'w'的方式,否则文件内容会被清空。

那么,究竟应该如何用Python判断一个文件是否被占用呢?这个问题还是要回归到操作系统层面来解决,也就是依赖win32api模块。

>>> import win32file
>>> def is_used(file_name):
	try:
		vHandle = win32file.CreateFile(file_name, win32file.GENERIC_READ, 0, None, win32file.OPEN_EXISTING, win32file.FILE_ATTRIBUTE_NORMAL, None)
		return int(vHandle) == win32file.INVALID_HANDLE_VALUE
	except:
		return True
	finally:
		try:
			win32file.CloseHandle(vHandle)
		except:
			pass
		
>>> fn = r'D:\temp\csdn\t.py'
>>> is_used(fn)
False
>>> fp = open(fn, 'a+')
>>> is_used(fn)
True
>>> fp.close()
>>> is_used(fn)
False

简单验证了一下,函数is_used()基本可用。

到此这篇关于使用Python判断一个文件是否被占用的文章就介绍到这了,更多相关Python判断文件被占用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python通过zlib实现压缩与解压字符串的方法
Nov 19 Python
Python中文分词工具之结巴分词用法实例总结【经典案例】
Apr 15 Python
Python表示矩阵的方法分析
May 26 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
Jul 27 Python
Windows下将Python文件打包成.EXE可执行文件的方法
Aug 03 Python
python利用跳板机ssh远程连接redis的方法
Feb 19 Python
python如何统计代码运行的时长
Jul 24 Python
pytorch下大型数据集(大型图片)的导入方式
Jan 08 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
Mar 24 Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
Jul 21 Python
Python-typing: 类型标注与支持 Any类型详解
May 10 Python
利用python进行数据加载
Jun 20 Python
python中类与对象之间的关系详解
Dec 16 #Python
python简单实现插入排序实例代码
Dec 16 #Python
python中函数返回多个结果的实例方法
Dec 16 #Python
python的setattr函数实例用法
Dec 16 #Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
Dec 16 #Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
Dec 16 #Python
python unichr函数知识点总结
Dec 16 #Python
You might like
php面向对象的方法重载两种版本比较
2008/09/08 PHP
理解php Hash函数,增强密码安全
2011/02/25 PHP
PHP 自定义错误处理函数trigger_error()
2013/03/26 PHP
php几个预定义变量$_SERVER用法小结
2014/11/07 PHP
PHP ajax 异步执行不等待执行结果的处理方法
2015/05/27 PHP
php实现可逆加密的方法
2015/08/11 PHP
PHP读取文件内容的五种方式
2015/12/28 PHP
PHP简单装饰器模式实现与用法示例
2017/06/22 PHP
JS 获取span标签中的值的代码 支持ie与firefox
2009/08/24 Javascript
jquery photoFrame 图片边框美化显示插件
2010/06/28 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
js实现选中页面文字将其分享到新浪微博
2015/11/05 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
2016/05/31 Javascript
微信小程序 Record API详解及实例代码
2016/09/30 Javascript
微信小程序 数据绑定及运算的简单实例
2017/09/20 Javascript
Spring Boot/VUE中路由传递参数的实现代码
2018/03/02 Javascript
详解vue 计算属性与方法跟侦听器区别(面试考点)
2018/04/23 Javascript
浅谈vue项目如何打包扔向服务器
2018/05/08 Javascript
详解如何在vue项目中使用layui框架及采坑
2019/05/05 Javascript
Python冒泡排序注意要点实例详解
2016/09/09 Python
python表格存取的方法
2018/03/07 Python
python实现linux下抓包并存库功能
2018/07/18 Python
PyQt5通信机制 信号与槽详解
2019/08/07 Python
python 并发编程 多路复用IO模型详解
2019/08/20 Python
Python中的xlrd模块使用原理解析
2020/05/21 Python
Python读取二进制文件代码方法解析
2020/06/22 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
2020/12/17 Python
经典C++面试题一
2016/11/06 面试题
计算机工程学院个人求职信
2013/10/05 职场文书
英语自我评价范文
2014/01/24 职场文书
新郎婚礼答谢词
2015/01/04 职场文书
校园开放日新闻稿
2015/07/17 职场文书
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python
java后台调用接口及处理跨域问题的解决
2022/03/24 Java/Android
Python利用zhdate模块实现农历日期处理
2022/03/31 Python
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技