文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python对大文件的增量读取

2023-01-31 05:45

关注

欢迎关注我的豆瓣http://www.douban.com/note/484517776/  

对于很多大文件的增量读取,如果遍历每一行比对历史记录的输钱或者全都加载到内存通过历史记录的索引查找,是非常浪费资源的,网上有很多人的技术博客都是写的用for循环readline以及一个计数器去增量读取,这样是十分脑残的,假如文件很大,遍历一次太久。
 我们需要了解获取文件句柄的基本理论,其中包含的指针操作等。
 原理是这样子,linux的文件描述符的struct里有一个f_pos的这么个属性,里面存着文件当前读取位置,通过这个东东经过vfs的一系列映射就会得到硬盘存储的位置了,所以很直接,很快。
 以下是利用python实战代码,核心函数tell(),seek(). 也是调用的系统调用seek tell

seek()的三种模式:

   (1)f.seek(p,0)  移动当文件第p个字节处,绝对位置

   (2)f.seek(p,1)  移动到相对于当前位置之后的p个字节

   (3)f.seek(p,2)  移动到相对文章尾之后的p个字节

tell():
   返回当前文件的读取位置。
代码:
#!/usr/bin/python
fd=open("test.txt",'r') #获得一个句柄
for i in xrange(1,3): #读取三行数据
   fd.readline()
label=fd.tell() #记录读取到的位置
fd.close() #关闭文件
#再次阅读文件
fd=open("test.txt",'r') #获得一个句柄
fd.seek(label,0)# 把文件读取指针移动到之前记录的位置
fd.readline() #接着上次的位置继续向下读取



后续:今儿有一人问我如何得知这个大文件行数,以及变化,我的想法是
方法1:
可以去遍历'\n'字符。
方法2:
从一开始就用for循环fd.readline()进行计数,然后变化的部分(用上文说的seek、tell函数做)再用for循环fd.readline()进行统计增加行数。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯