如何从一个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 ...
随机推荐
- Android 轻松实现后台搭建+APP版本更新
http://blog.csdn.net/u012422829/article/details/46355515 (本文讲解了在Android中实现APP版本更新,文末附有源码.) 看完本文,您可以学 ...
- Codeforces Round #449 (Div. 2) A. Scarborough Fair【多次区间修改字符串】
A. Scarborough Fair time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 多层代理获取用户真实IP
1. 几个概念remote_addr:如果中间没有代理,这个就是客户端的真实IP,如果有代理,这就是上层代理的IP.X-Forwarded-For:一个HTTP扩展头,格式为 X-Forwarded- ...
- Codeforces Round #325 (Div. 2) Laurenty and Shop 模拟
原题链接:http://codeforces.com/contest/586/problem/B 题意: 大概就是给你一个两行的路,让你寻找一个来回的最短路,并且不能走重复的路. 题解: 就枚举上下选 ...
- php升级版本
Centos下Yum安装PHP5.5,5.6,7.0 默认的版本太低了,手动安装有一些麻烦,想采用Yum安装的可以使用下面的方案: 1.检查当前安装的PHP包 yum list installed | ...
- hdu 5206 Four Inages Strategy 计算几何
题目链接:HDU - 5206 Young F found a secret record which inherited from ancient times in ancestral home b ...
- sql server 存储过程中使用变量表,临时表的分析(续)
最近,我有一朋友,对我说他的数据库中的很多存储过程,执行都是超时.让我替他看看是什么原因.我一看,原来他的存储过程中用了很多的临时表与变量表.于是我跟他说过犹不及. 在存储过程中使用临时表或变量表,使 ...
- yaffs和jffs2简单比较
转:http://blog.chinaunix.net/uid-27675161-id-3392636.html 相关知识引用<嵌入式 Linux 应用开发 完全手册> Nand F ...
- kaptcha验证码
@Action("/validimg") public String validimg() throws Exception { genernateCaptchaImage(); ...
- iOS8使用TestFlight进行内部测试功能尝鲜
iOS8发布了有一段时间了,我们的策划很新潮的速度给升级到iOS8了.于是XCode5不支持了,只好从MacOS 10.8升级到10.9,再升级到10.9.5,再下载XCode6安装…… 然后前两天上 ...