使用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中的greenlet包实现并发编程的入门教程
Apr 16 Python
Python中exit、return、sys.exit()等使用实例和区别
May 28 Python
Python-OpenCV基本操作方法详解
Apr 02 Python
Python中矩阵创建和矩阵运算方法
Aug 04 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
Python模拟百度自动输入搜索功能的实例
Feb 14 Python
了解不常见但是实用的Python技巧
May 23 Python
解决python中导入win32com.client出错的问题
Jul 26 Python
关于python导入模块import与常见的模块详解
Aug 28 Python
对pytorch的函数中的group参数的作用介绍
Feb 18 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
Jun 10 Python
用python制作个音乐下载器
Jan 30 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
基于asp+ajax和数据库驱动的二级联动菜单
2010/05/06 PHP
用php实现选择排序的解决方法
2013/05/04 PHP
PHP页面实现定时跳转的方法
2014/10/31 PHP
学习php设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
JavaScript 笔记二 Array和Date对象方法
2010/05/22 Javascript
Js+Flash实现访问剪切板操作
2012/11/20 Javascript
Node调试工具JSHint的安装及配置教程
2014/05/27 Javascript
javascript中的遍历for in 以及with的用法
2014/12/22 Javascript
JavaScript通过字典进行字符串翻译转换的方法
2015/03/19 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
jQuery循环遍历子节点并获取值的方法
2016/04/14 Javascript
CSS3 3D 技术手把手教你玩转
2016/09/02 Javascript
BootStrap实现鼠标悬停下拉列表功能
2017/02/17 Javascript
详解Angular中的自定义服务Service、Provider以及Factory
2017/04/22 Javascript
详解JS取出两个数组中的不同或相同元素
2019/03/20 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
2019/10/25 Javascript
[55:32]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第二场
2018/04/05 DOTA
Python 获取当前所在目录的方法详解
2017/08/02 Python
python实现朴素贝叶斯分类器
2018/03/28 Python
Python中实现变量赋值传递时的引用和拷贝方法
2018/04/29 Python
python向已存在的excel中新增表,不覆盖原数据的实例
2018/05/02 Python
Django 根据数据模型models创建数据表的实例
2018/05/27 Python
pytorch自定义二值化网络层方式
2020/01/07 Python
python程序如何进行保存
2020/07/03 Python
flask项目集成swagger的方法
2020/12/09 Python
详解CSS3原生支持div铺满浏览器的方法
2018/08/30 HTML / CSS
来自Ocado的宠物商店:Fetch
2018/07/10 全球购物
会计学财务管理专业个人的自我评价
2013/10/19 职场文书
护理专业毕业生推荐信
2013/10/31 职场文书
公司司机岗位职责
2014/02/07 职场文书
2014年两会学习心得体会
2014/03/10 职场文书
职位说明书范文
2014/05/07 职场文书
2016年共产党员个人承诺书
2016/03/24 职场文书
电频谱管理的原则是什么
2022/02/18 无线电
Python可视化神器pyecharts绘制地理图表
2022/07/07 Python