使用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中的yield浅析
Jun 16 Python
Python 迭代器工具包【推荐】
May 06 Python
Windows下Python使用Pandas模块操作Excel文件的教程
May 31 Python
Python的collections模块中namedtuple结构使用示例
Jul 07 Python
python模块之re正则表达式详解
Feb 03 Python
Django应用程序中如何发送电子邮件详解
Feb 04 Python
Python 装饰器使用详解
Jul 29 Python
python安装pywin32clipboard的操作方法
Jan 24 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
Aug 05 Python
阿里云ECS服务器部署django的方法
Aug 29 Python
pytorch 实现cross entropy损失函数计算方式
Jan 02 Python
Python如何重新加载模块
Jul 29 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过滤危险html代码
2008/08/18 PHP
smarty内置函数foreach用法实例
2015/01/22 PHP
php解析http获取的json字符串变量总是空白null
2015/03/02 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
2016/06/28 PHP
原生php实现excel文件读写的方法分析
2018/04/25 PHP
php文件操作之文件写入字符串、数组的方法分析
2019/04/15 PHP
php链式操作的实现方式分析
2019/08/12 PHP
Prototype源码浅析 Enumerable部分之each方法
2012/01/16 Javascript
JavaScript设置IFrame高度自适应(兼容各主流浏览器)
2013/06/05 Javascript
JavaScript中的关联数组问题
2015/03/04 Javascript
浅谈JavaScript函数的四种存在形态
2016/06/08 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
js仿微博动态栏功能
2017/02/22 Javascript
bootstrap折叠调用collapse()后data-parent不生效的快速解决办法
2017/02/23 Javascript
原生JS实现九宫格抽奖效果
2017/04/01 Javascript
JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)
2017/05/17 Javascript
jQuery获取单选按钮radio选中值与去除所有radio选中状态的方法
2017/05/20 jQuery
浅谈vue.js中v-for循环渲染
2017/07/26 Javascript
vue基础之事件v-onclick="函数"用法示例
2019/03/11 Javascript
vant实现购物车功能
2020/06/29 Javascript
[00:37]2016完美“圣”典风云人物:AMS宣传片
2016/12/06 DOTA
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
Python的Django框架中settings文件的部署建议
2015/05/30 Python
用于业余项目的8个优秀Python库
2018/09/21 Python
python交易记录链的实现过程详解
2019/07/03 Python
Django之使用内置函数和celery发邮件的方法示例
2019/09/16 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
2020/01/20 Python
python轮询机制控制led实例
2020/05/03 Python
基于Python绘制个人足迹地图
2020/06/01 Python
HTML5 本地存储和内容按需加载的思路和方法
2011/04/07 HTML / CSS
澳大利亚波西米亚风连衣裙在线商店:Fortunate One
2019/04/01 全球购物
安全生产投入制度
2014/01/29 职场文书
幼儿园老师工作总结2015
2015/05/22 职场文书
MySQL 视图(View)原理解析
2021/05/19 MySQL
vue实力踩坑之push当前页无效
2022/04/10 Vue.js