如何从一个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. windows 2012(64位) IIS配置asp程序 500 - 内部服务器错误。您查找的资源存在问题,因而无法显示。

    在网上找了很久,包括常规的设置父路径之类的,一直都不可以,搞了一晚上毫无成就感,第二天早上无意中看到一篇文章,说到点子上了,非常感谢.源地址已经找不到了,我把大概的问题截图说明一下. 方法如下:1.打 ...

  2. Mac下安装npm,http-server,安装虚拟服务器

    http-server是一个简单的,不需要配置的命令行下使用的http服务器.类似的还有Xampp等. 针对前端开发工程的代码不需要编译的特点,使用这种简单的服务器十分的便利. 1.安装这个首先要安装 ...

  3. JAVA反映练手

    import java.util.List; import java.util.ArrayList; import java.lang.reflect.Method; import java.lang ...

  4. 01背包【p1060】开心的金明

    Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要 ...

  5. 线段树【p1607】[USACO09FEB]庙会班车Fair Shuttle

    Description 逛逛集市,兑兑奖品,看看节目对农夫约翰来说不算什么,可是他的奶牛们非常缺乏锻炼--如果要逛完一整天的集市,他们一定会筋疲力尽的.所以为了让奶牛们也能愉快地逛集市,约翰准备让奶牛 ...

  6. 洛谷——P2660 zzc 种田

    P2660 zzc 种田 题目背景 可能以后 zzc就去种田了. 题目描述 田地是一个巨大的矩形,然而zzc 每次只能种一个正方形,而每种一个正方形时zzc所花的体力值是正方形的周长,种过的田不可以再 ...

  7. HDU 3966 Aragorn's Story(树链剖分)(线段树区间修改)

    Aragorn's Story Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  8. logstash filter plugin

    1. 基本语法%{NUMBER:duration} %{IP:client} 2. 支持的数据类型默认会把所有的匹配都当作字符串,比如0.043, 想要转成浮点数,可以%{NUMBER:num:flo ...

  9. luogu P1361 小M的作物

    题目链接 luogu P1361 小M的作物 题解 源汇点为A,B 向种子连边,容量为价值,每个种子能与A或B联通,考虑最小割 用建边的总流量减去最小割就是答案 相同利益的时候新建节点,由额外利益构成 ...

  10. hdu 1015 Safecracker 水题一枚

    题目链接:HDU - 1015 === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Klein s ...