使用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使用百度翻译进行中翻英示例
Apr 14 Python
python实现分页效果
Oct 25 Python
python中hashlib模块用法示例
Oct 30 Python
python通过伪装头部数据抵抗反爬虫的实例
May 07 Python
对Python 语音识别框架详解
Dec 24 Python
在python 不同时区之间的差值与转换方法
Jan 14 Python
面向对象学习之pygame坦克大战
Sep 11 Python
python标准库OS模块函数列表与实例全解
Mar 10 Python
Python实现从N个数中找到最大的K个数
Apr 02 Python
pycharm 2018 激活码及破解补丁激活方式
Sep 21 Python
python 递归相关知识总结
Mar 03 Python
Python内置类型集合set和frozenset的使用详解
Apr 26 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
为php4加入动态flash文件的生成的支持
2006/10/09 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
2013/07/03 PHP
PHP中子类重载父类的方法【parent::方法名】
2016/05/06 PHP
PHP中多线程的两个实现方法
2016/10/14 PHP
PHP中单例模式与工厂模式详解
2017/02/17 PHP
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
jQuery 使用手册(七)
2009/09/23 Javascript
js实现简单的星级选择器提交效果适用于评论等
2013/10/18 Javascript
jquery中append()与appendto()用法分析
2014/11/14 Javascript
JavaScript实现在标题栏上显示当前日期的方法
2015/03/19 Javascript
谈谈impress.js初步理解
2015/09/09 Javascript
jQuery EasyUI之DataGrid使用实例详解
2016/01/04 Javascript
JavaScript中匿名函数的用法及优缺点详解
2016/06/01 Javascript
jQuery实现iframe父窗体和子窗体的相互调用
2016/06/17 Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
2016/09/26 Javascript
JavaScript中日常收集常见的10种错误(推荐)
2017/01/08 Javascript
element-ui循环显示radio控件信息的方法
2018/08/24 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
微信小程序 如何保持登录状态
2019/08/16 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
python实现的防DDoS脚本
2011/02/08 Python
微信跳一跳自动运行python脚本
2018/01/08 Python
Python3 Post登录并且保存cookie登录其他页面的方法
2018/12/28 Python
使用Filter过滤python中的日志输出的实现方法
2019/07/17 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
CSS3 中filter(滤镜)属性使用详解
2020/04/07 HTML / CSS
FOREO斐珞尔官方旗舰店:LUNA露娜洁面仪
2018/03/11 全球购物
英国乡村时尚和宠物用品专家:Pet & Country
2018/07/02 全球购物
手工制作的男士奢华英国鞋和服装之家:Goodwin Smith
2019/06/21 全球购物
顺丰快递Java软件工程师面试题
2015/07/31 面试题
幼儿园招生广告
2014/03/19 职场文书
个人整改方案范文
2014/10/25 职场文书
2014年会计工作总结
2014/11/27 职场文书
Go中的条件语句Switch示例详解
2021/08/23 Golang
WebRTC记录音视频流(web技术分享)
2022/02/24 Javascript
PostgreSQL逻辑复制解密原理解析
2022/09/23 PostgreSQL