2013-11-01 95 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