如何从一个1G的文件中找到你所需要的东西,这个问题貌似面试的时候会经常问到。不过不论你用什么语言,肯定逃脱不了按指针读或者按块读。

这里介绍python的用法。本人亲自实验了,速度还可以。

如果你的文件还不是很大,那么最好的方式:

with open('log2.txt') as f:
for line in f:
print line.strip()

貌似这种方式是最快的,不过如果再大点的话,还是比较耗时

这里有个日志文件,请看格式:

现在我们想把开始时间为2015-07-18-18:58:00到2015-07-18-18:58:01这段时间的日志快速的筛选出来。

其实你只要理解文件指针的移动就很会很快有思路。

fp = open('log.txt')

fp.tell()文件指针的位置

fp.seek(0,os.SEEK_END) 文件结尾

fp.seek(0,os.SEEK_SET) 定位到文件开头

fp.seek(123,os.SEEK_SET) 定位到指针123的位置

fp.seek(0,os.SEEK_CUR) 当前指针的位置

下面是源代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Eric.yue import os,time def find_start_time(start_time,f,size):
start_point = -1
seek_point = f.tell()
#找到开始位置的指针
while seek_point < size:
line = f.readline()
if line.startswith(start_time):
start_point = seek_point
break
seek_point = f.tell()
return start_point def find_end_time(end_time,f, size):
end_point = -1
seek_point = f.tell() while seek_point < size:
line = f.readline()
if line.startswith(end_time):
end_point = seek_point
print 'first end line pos:%s' % line
break
#指针移动一定要加上不然会出现死循环
seek_point = f.tell() #继续移动指针找到最后一次出现的时间位置
while seek_point < size:
line = f.readline()
if not line.startswith(end_time):
end_point = seek_point
print 'last end line pos:%s' % line
break
seek_point = f.tell() return end_point def read_file(start_point,end_point,fp):
fp.seek(start_point, os.SEEK_SET)
while fp.tell() < end_point:
print fp.readline() if __name__ == '__main__':
fp = open('./log','r')
fp.seek(0,os.SEEK_END)
#获取文件最后的位置
size = fp.tell()
#重新定位到开头
fp.seek(0, os.SEEK_SET) s_time = time.time()
#查找开始时间的位置
s_point = find_start_time('2015-07-18-18:58:00',fp,size)
#查找结束时间的位置
e_point = find_end_time('2015-07-18-18:58:01', fp, size)
#打印开始时间和结束时间的数据
read_file(s_point,e_point,fp) e_time = time.time()
print 'spend time %s' % (e_time - s_time)
fp.close()

OVER!

如何从一个1G的文件中找到你所需要的东西的更多相关文章

  1. C语言:根据形参c中指定的英文字母,按顺序打印出若干后继相邻字母,-主函数中放入一个带头节点的链表结构中,h指向链表的头节点。fun函数找出学生的最高分-使用插入排序法对字符串中的字符进行升序排序。-从文件中找到指定学号的学生数据,读入次学生数据,

    //根据形参c中指定的英文字母,按顺序打印出若干后继相邻字母,输出字母的大小与形参c一致,数量由形参d指定.例如:输入c为Y,d为4,则输出ZABC. #include <stdio.h> ...

  2. 将目录下面所有的 .cs 文件合并到一个 code.cs 文件中,写著作权复制代码时的必备良药

    将目录下面所有的 .cs 文件合并到一个 code.cs 文件中,写著作权复制代码时的必备良药 @echo off echo 将该目录下所有.cs文件的内容合并到一个 code.cs 文件中! pau ...

  3. 利用fgetc合并2个源文件的内容,到一个新的文件中

    #include <stdio.h> #include <stdlib.h> //功能: 合并2个源文件的内容,到一个新的文件中 int main(int a,char *ar ...

  4. Lua增加一个节点到文件中

    新建一个文件touch /etc/config/ddns 增加一个节点到文件中uci set ddns.newadd=config <config>:即配置文件,如ddns,ipv6等&l ...

  5. UTF-8和UTF-8无BOM,一个会导致文件中中文变量无法匹配的bug

    昨晚用dom4j中的selectSingleNode解析xml,匹配节点. 发现匹配不到,但是确实存在该节点 将regex改为regex1后则可以匹配,也就是说文件中的"阿里旺旺" ...

  6. JSFinder:一个在js文件中提取URL和子域名的脚本

    JSFinder介绍 JSFinder是一款用作快速在网站的js文件中提取URL,子域名的脚本工具. 支持用法 简单爬取 深度爬取 批量指定URL/指定JS 其他参数 以往我们子域名多数使用爆破或DN ...

  7. LeetCode 128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence.Fo ...

  8. 多个css样式合并到一个“目录”css文件中

    执行访问jsp后发现没有效果 同样的代码,在html中效果对比如下: 具体原因:不清楚,暂时记着~~~在jsp中不支持@import这种css样式的引用

  9. 128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列

    给定一个未排序的整数数组,找出最长连续序列的长度.例如,给出 [100, 4, 200, 1, 3, 2],这个最长的连续序列是 [1, 2, 3, 4].返回所求长度: 4.要求你的算法复杂度为 O ...

随机推荐

  1. jQuery中的each关键词

    #转载请留言联系 从一个简单的例子引入,jQuery里的each有什么作用? <!DOCTYPE html> <html lang="en"> <he ...

  2. C#模拟进行压力测试

    using System; using System.Diagnostics; using System.IO; using System.Net; using System.Text; using ...

  3. springBoot Ribbon Hystrix

    1.依赖包引入 <!-- 引入关于 hystrix的依赖 --> <dependency> <groupId>org.springframework.cloud&l ...

  4. #421 Div1 C

    #421 Div1 C 题意 在 (0, n) 和 (m, 0) 处各有一个装置,从起始点(0, 0)出发,首先走短路到 (m, 0) 拿起装置回到起始点,再去 (0, n) 处拿起装置回到起始点.当 ...

  5. 【BZOJ3524】Couriers

    题面 Description 给一个长度为\(n\)的序列\(a\).\(1\le a[i]\le n\). \(m\)组询问,每次询问一个区间\([l,r]\),是否存在一个数在\([l,r]\)中 ...

  6. List和ArrayList的区别和联系

    1.    List是一个接口,而ArrayList是List接口的一个实现类. ArrayList类继承并实现了List接口. 因此,List接口不能被构造,也就是我们说的不能创建实例对象,但是我们 ...

  7. 阿里云ECS在CentOS 6.9中使用Nginx提示:nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)的解决方法

    说明: 1.[::]:80这个是IPv6的地址. 2.阿里云截至到今天还不支持IPv6. 解决方式: 1.普通解决方式:开启IPv6的支持,不过这个方法在阿里云行不通. vim /etc/nginx/ ...

  8. PHP 让__get方法重新执行

    <?php class A { public function __get($p) { echo "getting $p\r\n"; if(isset($this->$ ...

  9. 体验VisualStudio 2013中的内存分析功能

    内存分析一直是个比较令人头痛的问题,Visual Studio 2013中就集成了一个内存分析的功能,可以方便我们进行分析内存的占用情况.本文将简单的介绍一下如何使用这个功能. 首先以一个简单的程序为 ...

  10. Visio中如何画面积一样的形状

    如图,刚开始我想着用辅助的那些线(对齐),实现不了,后来想想直接复制就行了...........