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 正则式使用心得
May 07 Python
python strip()函数 介绍
May 24 Python
python重试装饰器示例
Feb 11 Python
Python实现的简单排列组合算法示例
Jul 04 Python
python 实现得到当前时间偏移day天后的日期方法
Dec 31 Python
Python3中的f-Strings增强版字符串格式化方法
Mar 04 Python
Python函数默认参数常见问题及解决方案
Mar 26 Python
基于Python测试程序是否有错误
May 16 Python
keras 自定义loss层+接受输入实例
Jun 28 Python
浅谈Python 钉钉报警必备知识系统讲解
Aug 17 Python
python获得命令行输入的参数的两种方式
Nov 02 Python
python基于tkinter制作无损音乐下载工具
Mar 29 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解压缩zip和rar压缩包文件的方法
2019/07/10 PHP
JavaScript 轻松搞定快捷留言功能 只需一行代码
2010/04/01 Javascript
JQuery优缺点分析说明
2010/06/09 Javascript
一个简单的Ext.XTemplate的实例代码
2012/03/18 Javascript
说说JSON和JSONP 也许你会豁然开朗
2012/09/02 Javascript
jQuery写的日历(包括日历的样式及功能)
2013/04/23 Javascript
浅析jquery某一元素重复绑定的问题
2014/01/03 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
浅谈JavaScript中的this指针和引用知识
2016/08/05 Javascript
JS+DIV实现的卷帘效果示例
2017/03/22 Javascript
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
微信小程序实时聊天WebSocket
2018/07/05 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
2018/08/31 Javascript
JQuery Ajax跨域调用和非跨域调用问题实例分析
2019/04/16 jQuery
jquery-ui 进度条功能示例【测试可用】
2019/07/25 jQuery
在vue中高德地图引入和轨迹的绘制的实现
2019/10/11 Javascript
如何通过Proxy实现JSBridge模块化封装
2020/10/22 Javascript
[00:55]2015国际邀请赛中国区预选赛5月23日——28日约战上海
2015/05/25 DOTA
用Python中的__slots__缓存资源以节省内存开销的方法
2015/04/02 Python
Python基于回溯法子集树模板解决0-1背包问题实例
2017/09/02 Python
Python基础学习之常见的内建函数整理
2017/09/06 Python
Python zip()函数用法实例分析
2018/03/17 Python
PyTorch的深度学习入门之PyTorch安装和配置
2019/06/27 Python
python运用pygame库实现双人弹球小游戏
2019/11/25 Python
Python中if有多个条件处理方法
2020/02/26 Python
如何基于python对接钉钉并获取access_token
2020/04/21 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
2020/06/12 Python
python线性插值解析
2020/07/05 Python
结婚喜宴家长答谢词
2014/01/15 职场文书
中学教师师德师风演讲稿
2014/08/22 职场文书
人大代表选举标语
2014/10/07 职场文书
学校教师培训工作总结
2015/10/14 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
Python实现单例模式的5种方法
2021/06/15 Python
苹果的回收机器人可以通过拆解iPhone获取大量的金和铜并外公布了环境保护最新进展
2022/04/21 数码科技