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在命令行下使用google翻译(带语音)
Jan 16 Python
Python基本数据类型详细介绍
Mar 11 Python
Python selenium文件上传方法汇总
Nov 19 Python
Python实现求两个数组交集的方法示例
Feb 23 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
Transpose 数组行列转置的限制方式
Feb 11 Python
python实现图像全景拼接
Mar 27 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
May 12 Python
Django之腾讯云短信的实现
Jun 12 Python
django 装饰器 检测登录状态操作
Jul 02 Python
Python趣味挑战之给幼儿园弟弟生成1000道算术题
May 28 Python
python ConfigParser库的使用及遇到的坑
Feb 12 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+MySQL的聊天室设计
2006/10/09 PHP
深入php处理整数函数的详解
2013/06/09 PHP
PHP中模拟处理HTTP PUT请求的例子
2014/07/22 PHP
PHP共享内存用法实例分析
2016/02/12 PHP
PHP使用http_build_query()构造URL字符串的方法
2016/04/02 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
2017/10/13 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
JAVASCRIPT IE 与 FF中兼容问题小结
2009/02/18 Javascript
JQuery的一些小应用收集
2010/03/27 Javascript
麻雀虽小五脏俱全 Dojo自定义控件应用
2010/09/04 Javascript
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
ExtJS[Desktop]实现图标换行示例代码
2013/11/17 Javascript
使用jQuery和PHP实现类似360功能开关效果
2014/02/12 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
2016/06/21 Javascript
Three.js学习之正交投影照相机
2016/08/01 Javascript
轻松搞定js表单验证
2016/10/13 Javascript
jquery表单插件form使用方法详解
2017/01/20 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
微信小程序中遇到的iOS兼容性问题小结
2018/11/14 Javascript
vue自定义指令的创建和使用方法实例分析
2018/12/04 Javascript
[33:39]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第二局
2016/02/27 DOTA
Python语法快速入门指南
2015/10/12 Python
Python设计模式之代理模式简单示例
2018/01/09 Python
快速了解Python中的装饰器
2018/01/11 Python
windows下python安装小白入门教程
2018/09/18 Python
Python实现常见的回文字符串算法
2018/11/14 Python
Django中使用Whoosh进行全文检索的方法
2019/03/31 Python
python中wheel的用法整理
2020/06/15 Python
带有css3动画效果的兼容多浏览器简单导航条示例
2014/01/26 HTML / CSS
北大自主招生自荐信
2013/10/19 职场文书
食品安全标语
2014/06/07 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
党员个人承诺书
2015/04/27 职场文书
文艺委员竞选稿
2015/11/19 职场文书
感恩信:写给爸爸妈妈的一封感谢信
2019/09/12 职场文书
vue项目中的支付功能实现(微信支付和支付宝支付)
2022/02/18 Vue.js