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的Tornado框架实现一个简单的WebQQ机器人
Apr 24 Python
python实现在字符串中查找子字符串的方法
Jul 11 Python
Python3 处理JSON的实例详解
Oct 29 Python
详解Pandas之容易让人混淆的行选择和列选择
Jul 10 Python
django 实现celery动态设置周期任务执行时间
Nov 19 Python
tensorflow使用range_input_producer多线程读取数据实例
Jan 20 Python
Python抓包程序mitmproxy安装和使用过程图解
Mar 02 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
Sep 01 Python
AI:如何训练机器学习的模型
Apr 16 Python
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
May 27 Python
Python采集壁纸并实现炫轮播
Apr 30 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语言流程控制中的主动与被动
2012/11/05 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
2014/08/05 PHP
Extjs学习过程中新手容易碰到的低级错误积累
2010/02/11 Javascript
Jquery实现视频播放页面的关灯开灯效果
2013/05/27 Javascript
js/html光标定位的实现代码
2013/09/23 Javascript
使用jquery.validate自定义方法实现"手机号码或者固话至少填写一个"的逻辑验证
2014/09/01 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
不同编码的页面表单数据乱码问题解决方法
2015/02/15 Javascript
使用Chrome浏览器调试AngularJS应用的方法
2015/06/18 Javascript
javascript 中的事件委托详解
2016/10/25 Javascript
js实现简易聊天对话框
2017/08/17 Javascript
不使用 JS 匿名函数理由
2017/11/17 Javascript
Vue.js分页组件实现:diVuePagination的使用详解
2018/01/10 Javascript
webpack多入口多出口的实现方法
2018/08/17 Javascript
node获取客户端ip功能简单示例
2019/08/24 Javascript
Nodejs技巧之Exceljs表格操作用法示例
2019/11/06 NodeJs
在Vue中使用antv的示例代码
2020/06/29 Javascript
python删除特定文件的方法
2015/07/30 Python
Python中查看文件名和文件路径
2017/03/31 Python
Python使用xlwt模块操作Excel的方法详解
2018/03/27 Python
Python使用pandas处理CSV文件的实例讲解
2018/06/22 Python
Django框架使用富文本编辑器Uedit的方法分析
2018/07/31 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
2020/06/04 Python
python 爬虫请求模块requests详解
2020/12/04 Python
html5 Canvas画图教程(1)—画图的基本常识
2013/01/09 HTML / CSS
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
戴森英国官网:Dyson英国
2019/05/07 全球购物
施华洛世奇波兰官网:SWAROVSKI波兰
2019/06/18 全球购物
大唐面试试题(CPU,UNIX等等)
2012/01/11 面试题
分厂厂长岗位职责
2013/12/29 职场文书
打架检讨书300字
2014/02/02 职场文书
网上祭先烈心得体会
2014/09/01 职场文书
上课迟到检讨书
2015/05/06 职场文书
索尼ICF-36收音机评测
2022/04/30 无线电
Python OpenGL基本配置方式
2022/05/20 Python