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中isnumeric()方法的使用简介
May 19 Python
Django学习笔记之Class-Based-View
Feb 15 Python
Python信息抽取之乱码解决办法
Jun 29 Python
python中找出numpy array数组的最值及其索引方法
Apr 17 Python
python实现超市扫码仪计费
May 30 Python
python中reader的next用法
Jul 24 Python
pycharm运行程序时在Python console窗口中运行的方法
Dec 03 Python
对python:print打印时加u的含义详解
Dec 15 Python
利用Python实现Shp格式向GeoJSON的转换方法
Jul 09 Python
numpy.linalg.eig() 计算矩阵特征向量方式
Nov 29 Python
Python3.7黑帽编程之病毒篇(基础篇)
Feb 04 Python
用Python自动清理系统垃圾的实现
Jan 18 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使用array_rand()函数从数组中随机选择一个或多个元素
2014/04/28 PHP
php实现webservice实例
2014/11/06 PHP
Yii实现复选框批量操作实例代码
2017/03/15 PHP
PHP查询分页的实现代码
2017/06/09 PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
2018/05/12 PHP
PHP后台实现微信小程序登录
2018/08/03 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
2019/06/25 PHP
Javascript客户端脚本的设计和应用
2006/08/21 Javascript
整理一些JavaScript的IE和火狐的兼容性注意事项
2011/03/17 Javascript
JQuery实现鼠标移动到图片上显示边框效果
2014/01/09 Javascript
JavaScript中的Math.sin()方法使用详解
2015/06/15 Javascript
js实现跨域的4种实用方法原理分析
2015/10/29 Javascript
灵活使用数组制作图片切换js实现
2016/07/28 Javascript
jQueryUI Datepicker组件设置日期高亮
2016/10/13 Javascript
vue中渐进过渡效果实现
2016/10/27 Javascript
VueJs监听window.resize方法示例
2018/01/17 Javascript
vue小白入门教程
2018/04/02 Javascript
微信小程序云开发(数据库)详解
2019/05/17 Javascript
Element Collapse 折叠面板的使用方法
2020/07/26 Javascript
Python入门篇之字符串
2014/10/17 Python
Python和JavaScript间代码转换的4个工具
2016/02/22 Python
Python使用内置json模块解析json格式数据的方法
2017/07/20 Python
单链表反转python实现代码示例
2018/02/08 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
党委书记岗位职责
2013/11/24 职场文书
团工委书记自荐书范文
2013/12/17 职场文书
写给女生的道歉信
2014/01/08 职场文书
文科生自我鉴定
2014/02/15 职场文书
社团活动总结报告
2014/06/27 职场文书
房屋产权证明书
2014/10/15 职场文书
高一军训感想
2015/08/07 职场文书
初二英语教学反思
2016/02/15 职场文书
2016年学校综治宣传月活动总结
2016/03/16 职场文书
Android中的Launch Mode详情
2022/06/05 Java/Android