如何从一个1G的文件中找到你所需要的东西
如何从一个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的文件中找到你所需要的东西的更多相关文章
- C语言:根据形参c中指定的英文字母,按顺序打印出若干后继相邻字母,-主函数中放入一个带头节点的链表结构中,h指向链表的头节点。fun函数找出学生的最高分-使用插入排序法对字符串中的字符进行升序排序。-从文件中找到指定学号的学生数据,读入次学生数据,
//根据形参c中指定的英文字母,按顺序打印出若干后继相邻字母,输出字母的大小与形参c一致,数量由形参d指定.例如:输入c为Y,d为4,则输出ZABC. #include <stdio.h> ...
- 将目录下面所有的 .cs 文件合并到一个 code.cs 文件中,写著作权复制代码时的必备良药
将目录下面所有的 .cs 文件合并到一个 code.cs 文件中,写著作权复制代码时的必备良药 @echo off echo 将该目录下所有.cs文件的内容合并到一个 code.cs 文件中! pau ...
- 利用fgetc合并2个源文件的内容,到一个新的文件中
#include <stdio.h> #include <stdlib.h> //功能: 合并2个源文件的内容,到一个新的文件中 int main(int a,char *ar ...
- Lua增加一个节点到文件中
新建一个文件touch /etc/config/ddns 增加一个节点到文件中uci set ddns.newadd=config <config>:即配置文件,如ddns,ipv6等&l ...
- UTF-8和UTF-8无BOM,一个会导致文件中中文变量无法匹配的bug
昨晚用dom4j中的selectSingleNode解析xml,匹配节点. 发现匹配不到,但是确实存在该节点 将regex改为regex1后则可以匹配,也就是说文件中的"阿里旺旺" ...
- JSFinder:一个在js文件中提取URL和子域名的脚本
JSFinder介绍 JSFinder是一款用作快速在网站的js文件中提取URL,子域名的脚本工具. 支持用法 简单爬取 深度爬取 批量指定URL/指定JS 其他参数 以往我们子域名多数使用爆破或DN ...
- LeetCode 128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列
Given an unsorted array of integers, find the length of the longest consecutive elements sequence.Fo ...
- 多个css样式合并到一个“目录”css文件中
执行访问jsp后发现没有效果 同样的代码,在html中效果对比如下: 具体原因:不清楚,暂时记着~~~在jsp中不支持@import这种css样式的引用
- 128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列
给定一个未排序的整数数组,找出最长连续序列的长度.例如,给出 [100, 4, 200, 1, 3, 2],这个最长的连续序列是 [1, 2, 3, 4].返回所求长度: 4.要求你的算法复杂度为 O ...
随机推荐
- windows 2012(64位) IIS配置asp程序 500 - 内部服务器错误。您查找的资源存在问题,因而无法显示。
在网上找了很久,包括常规的设置父路径之类的,一直都不可以,搞了一晚上毫无成就感,第二天早上无意中看到一篇文章,说到点子上了,非常感谢.源地址已经找不到了,我把大概的问题截图说明一下. 方法如下:1.打 ...
- Mac下安装npm,http-server,安装虚拟服务器
http-server是一个简单的,不需要配置的命令行下使用的http服务器.类似的还有Xampp等. 针对前端开发工程的代码不需要编译的特点,使用这种简单的服务器十分的便利. 1.安装这个首先要安装 ...
- JAVA反映练手
import java.util.List; import java.util.ArrayList; import java.lang.reflect.Method; import java.lang ...
- 01背包【p1060】开心的金明
Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要 ...
- 线段树【p1607】[USACO09FEB]庙会班车Fair Shuttle
Description 逛逛集市,兑兑奖品,看看节目对农夫约翰来说不算什么,可是他的奶牛们非常缺乏锻炼--如果要逛完一整天的集市,他们一定会筋疲力尽的.所以为了让奶牛们也能愉快地逛集市,约翰准备让奶牛 ...
- 洛谷——P2660 zzc 种田
P2660 zzc 种田 题目背景 可能以后 zzc就去种田了. 题目描述 田地是一个巨大的矩形,然而zzc 每次只能种一个正方形,而每种一个正方形时zzc所花的体力值是正方形的周长,种过的田不可以再 ...
- HDU 3966 Aragorn's Story(树链剖分)(线段树区间修改)
Aragorn's Story Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- logstash filter plugin
1. 基本语法%{NUMBER:duration} %{IP:client} 2. 支持的数据类型默认会把所有的匹配都当作字符串,比如0.043, 想要转成浮点数,可以%{NUMBER:num:flo ...
- luogu P1361 小M的作物
题目链接 luogu P1361 小M的作物 题解 源汇点为A,B 向种子连边,容量为价值,每个种子能与A或B联通,考虑最小割 用建边的总流量减去最小割就是答案 相同利益的时候新建节点,由额外利益构成 ...
- hdu 1015 Safecracker 水题一枚
题目链接:HDU - 1015 === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Klein s ...