如何从一个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 ...
随机推荐
- linux题目整理(二)
1.如何过滤出已知当前目录下oldboy中的所有一级目录(不包含子目录,即只能是一级目录) 方法1:find ./ -type d -maxdepth 1方法2:ls -F方法3:ls -l | g ...
- 项目管理软件Readmine安装配置
1.安装依赖 #yum install curl-devel sqlite-devel libyaml-devel -y 2.安装rvm #curl -L https://get.rvm.io | b ...
- (6)sql/puls
host 在sql/puls中使用cmd或linux操作系统的命令
- CF987C Three displays【一维DP/类似最大子序列和】
[链接]:CF987C [分析]:先求出每个s[i]后面比s[i]大的c[i]的最小值,然后枚举前两个数c(i),c(j)以及 j 后面递增且存在最小值的dp(j) [代码]: #include< ...
- SenseTime Ace Coder Challenge 暨 商汤在线编程挑战赛*
题目链接 Problems Problem A Problem B bitset…… Problem C Problem D Problem E Problem F Problem G 考虑最小生 ...
- 洛谷——2871[USACO07DEC]手链Charm Bracelet——01背包
题目描述 Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like t ...
- 初步接触LVS
今天整理下思绪,定下要掌握LVS原理和使用方法.于是,看了部分关于LVS的概述和文章. 章博士在2002年写的LVS的几篇文章,在我看来,今天都值得一看.http://www.linuxvirtual ...
- Codeforces 757 E Bash Plays with Functions
Discription Bash got tired on his journey to become the greatest Pokemon master. So he decides to ta ...
- centos安装postgresql-10及操作
安装postgresql: Linux启动: service postgresql start 创建用户: createuser username 创建数据库: createdb dbname -O ...
- [给自己扫盲]Node.js 究竟是什么?
Node.js 究竟是什么? 一个 “编码就绪” 服务器 Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编写能 ...