linecache模块加载和缓存文件内容详解


Posted in Python onJanuary 11, 2018

linecache模块

接触到linecache这个模块是因为前两天读attrs源码的时候看到内部代码引用了这个模块来模拟一个假文件,带着一脸疑问顺便读了一下这个模块的源码,发现其实也就那么回事儿,代码不多,在这总结一下。

linecache模块可以读取文件并将文件内容缓存起来,方便后面多次读取。这个模块原本被设计用来读取Python模块的源代码,所以当一个文件名不在指定路径下的时候,模块会通过搜索路径(search path)来尝试读取文件。

接口

linecache模块的__all__参数其实只提供了getline/clearcache/checkcache三个接口,但实际上可以使用的不止这些,下面我会对所有接口逐个进行介绍。

linecache.getline(filename, lineno, module_globals=None)

获取指定文件的某一行,filename指定文件名、lineno指定行号、module_globals用于指定模块的上下文我也不知道怎么称呼,姑且称为上下文吧,最后一个参数其实到会传到linecache.updatecache()里,用于尝试使用__loader__加载文件,一般情况下不会用到最后一个参数,忽略即可。当行号小于一或大于文件最大行号时函数直接返回空字符串。

linecache.clearcache()

清空所有缓存,注意是所有。

linecache.checkcache(filename=None)

这个函数用于检查缓存,如果文件的大小或者修改时间有变化,会把文件原先的缓存删除,如果文件是懒加载的则保持不变。当filename为None时检查缓存中的所有文件。

以下是没写进模块__all__参数的接口。

linecache.lazycache(filename, module_globals)

对指定文件使用懒加载,启用懒加载成功的文件会在实际调用获取内容的接口时才将文件内容加载进内存,使用这个可以避免多余的文件IO。返回值为一个布尔值,当懒加载成功时返回True,如果文件内容已经实际加载进内存或者加载失败则返回False。

这个函数的module_globals参数是必填的,其实就是传入要加载文件对应模块的上下文。比如加载linecache模块,则传入linecache.__dict__或者vars(linecache)(目前只想到这两种方法,当然你要自己构建一个字典传进去也是可以的)。然后函数会根据上下文获取__loader__的get_source函数保存到缓存中。这个函数是在Python3.5后新增的。

linecache.updatecache(filename, module_globals=None)

这个函数是整个模块的核心,用于更新文件缓存并返回文件内容。函数中间任何一个环节出错了会返回一个空列表。

对于普通文件,内部使用tokenize.open()函数用于打开文件,检测文件的编码并使用检测到的编码打开文件,如果缺失编码默认使用UTF-8。如果给定路径无法打开文件则使用sys.path指定的路径尝试加载。如果文件内容的最后一行不带\n,会自动在最后一个字符加上\n。

对于懒加载的文件,则调用懒加载时保存的get_source函数获取文件内容。

注意:linecache在打开文件之后使用readlines一次性加载所有文件内容,所以在文件很多或者文件太大时会出现问题,所以还是应该谨慎使用。

linecache.getlines(filename, module_globals=None)

获取文件所有内容,如果文件尚未加载或者是懒加载,会调用linecache.updatecache()加载文件内容,如果出现MemoryError则清空缓存。linecache.getline()其实内部就是调用了这个函数。

linecache.cache

这是一个字典,所有文件的缓存就存在这里面。字典的Key是你读取时传入的filename,Value是一个保存了文件大小、修改时间、内容、名字的元组,当文件为懒加载时则是对应__loader__的get_source函数。

总结

Python标准库内置了很多基础模块,平时不会注意到,但是总有一些别的代码会依赖到这些基础设施,像标准库里的pdb和traceback都有用到linecache模块。这里面其实有不少代码是能加以利用的,平时多多读源码,会有惊喜的。

以上就是本文关于linecache模块加载和缓存文件内容详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Python生成随机验证码的两种方法
Dec 22 Python
利用Python实现网络测试的脚本分享
May 26 Python
Python中Scrapy爬虫图片处理详解
Nov 29 Python
Django数据库表反向生成实例解析
Feb 06 Python
浅析Python数据处理
May 02 Python
python将一个英文语句以单词为单位逆序排放的方法
Dec 20 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
Jun 13 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
Sep 23 Python
Python通过文本和图片生成词云图
May 21 Python
分享unittest单元测试框架中几种常用的用例加载方法
Dec 02 Python
Python爬虫之Selenium警告框(弹窗)处理
Dec 04 Python
pytorch训练神经网络爆内存的解决方案
May 22 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
Jan 11 #Python
python+django+sql学生信息管理后台开发
Jan 11 #Python
hmac模块生成加入了密钥的消息摘要详解
Jan 11 #Python
快速了解Python中的装饰器
Jan 11 #Python
简单了解python模块概念
Jan 11 #Python
100行Python代码实现自动抢火车票(附源码)
Jan 11 #Python
python实现外卖信息管理系统
Jan 11 #Python
You might like
php开发环境配置记录
2011/01/14 PHP
PHP实现提高SESSION响应速度的几种方法详解
2019/08/09 PHP
一个简单的javascript类定义例子
2009/09/12 Javascript
javascript instanceof 内部机制探析
2010/10/15 Javascript
js动态拼接正则表达式的两种方法
2014/03/04 Javascript
jQuery Ajax()方法使用指南
2014/11/19 Javascript
Nodejs学习笔记之入门篇
2015/04/16 NodeJs
理解JavaScript表单的基础知识
2016/01/25 Javascript
Extjs4.0 ComboBox如何实现三级联动
2016/05/11 Javascript
浅谈JavaScript对象与继承
2016/07/10 Javascript
浅谈JS使用[ ]来访问对象属性
2016/09/21 Javascript
JS实现购物车特效
2017/02/02 Javascript
jQuery动态生成不规则表格(前后端)
2017/02/21 Javascript
关于js对textarea换行符的处理方法浅析
2018/08/03 Javascript
vue 中滚动条始终定位在底部的方法
2018/09/03 Javascript
vuejs简单验证码功能完整示例
2019/01/08 Javascript
深入了解响应式React Native Echarts组件
2019/05/29 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
2019/05/30 Javascript
layer.alert自定义关闭回调事件的方法
2019/09/27 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
2019/12/15 Javascript
Javascript实现简易天数计算器
2020/05/18 Javascript
vue 全局封装loading加载教程(全局监听)
2020/11/05 Javascript
在Python的Django框架中获取单个对象数据的简单方法
2015/07/17 Python
python操作mysql数据库
2017/03/05 Python
使用Python创建简单的HTTP服务器的方法步骤
2019/04/26 Python
pandas如何处理缺失值
2019/07/31 Python
python面向对象 反射原理解析
2019/08/12 Python
python2与python3爬虫中get与post对比解析
2019/09/18 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
纯CSS实现预加载动画效果
2017/09/06 HTML / CSS
劳资员岗位职责
2013/11/11 职场文书
优秀部门获奖感言
2014/02/14 职场文书
成龙霸王洗发水广告词
2014/03/14 职场文书
联谊会主持词
2014/03/26 职场文书
教师考核评语
2014/04/28 职场文书
爱的承诺书
2015/01/20 职场文书