2013-11-01 62 views
-1

我有一个大约100000行的大文本文件,我想阅读。我对所有内容都不感兴趣。我想搜索以“Residue XXX” 开头的行,然后阅读下面的三行。 我不想读取缓冲区中的列表中的整个行。是否有搜索该行并从那里如何在文件中搜索并从python中读取行

f=open("result.txt",r) 
lines = f.readlines()// NOT preferred 

我只是想一些投入阅读,如果有一种方法来搜索该行整个文件,而不是读他们和迭代的有效途径。

+0

那么你尝试过什么? – Joe

+0

好吧,我想要一些输入来尝试.. –

+4

你当然可以运行'grep -A 3'^ Residue XXX'result.txt'并使用该命令的输出。 – pobrelkey

回答

1
with open("result.txt") as f: 
    # find line starting with Residue XXX 
    next(line for line in f if not line.startswith("Residue XXX")) 
    # get next three lines into a list (empty string for nonexistent lines) 
    results = [next(f, "").rstrip() for line in range(3)] 

如果你想保持Residue XXX线为results列表的第一个项目:

with open("result.txt") as f: 
    # find line starting with Residue XXX 
    results = [next(line for line in f if not line.startswith("Residue XXX").rstrip()] 
    # add next three lines to the list (empty string for nonexistent lines) 
    results.extend(next(f, "").rstrip() for line in range(3)) 
1

你正在寻找的东西,如:

read_lines = None 

for l in open("result.txt"): 
    if read_lines: 
     print l.encode('unicode_escape') 
     read_lines -= 1 
    if read_lines == 0: 
     break 
    if l.startswith('Residue ddG RotamerProbability'): 
     read_lines = 3 

有subtlier解决方案,但这是简单明了。

0

文件对象是一个迭代器,如果你在不同的地方使用它,它将继续下去。 islice是从迭代器获取项目的方便函数。把它放在一起,使用for循环找到起始位置,然后休息。

我不确定你是想在你的列表中包含匹配的行还是想要在行结束中做什么,所以我决定添加匹配的行加上接下来的3行,没有拖尾行。

from itertools import islice 
with open('result.txt') as f: 
    for line in f: 
     if line.startswith("Residue XXX"): 
      my_list = [line.strip()] 
      my_list.extend(extra.strip() for extra in islice(f, 3)) 
      break 
1

除了通过读取数据以外,没有任何方法可以在文件中搜索。有更多或更少的有效方法来读取数据,所以例如用C语言来做它可能比Python中的循环更快,但是大概Python就是你想要使用的。

itertools模块提供了两个与你想要的功能:dropwhile搜索具有特定属性的值,并islice选择从一个迭代值的范围:

import itertools 

with open('result.txt') as infile: 
    def predicate(line): 
     return not line.startswith('Residue XXX') 
    result = list(itertools.islice(itertools.dropwhile(predicate, infile), 1, 4)) 

print result