Skip to main content
 首页 » 编程设计

python之使用 python 通过两个标识符从一个巨大的文本文件中提取行作为开始和结束

2025年05月04日15sky-heaven

我编写了一个函数来从一个大文本文件中提取特定的文本 block ,示例文本如下所示:

 ATP(1):C39(3) - A:TYR(58):CD2(67) 
     ATP(1):C39(3) - A:TYR(58):CE2(69) 
     ATP(1):C59(6) - A:ILE(61):CD1(100) 
     ATP(1):C59(6) - A:LYS(87):CE(344) 
 
Hydrogen bonds: 
    Location of Donor | Sidechain/Backbone | Secondary Structure | Count  
   -------------------|--------------------|---------------------|------- 
          LIGAND      |      SIDECHAIN     |        OTHER        |   1    
 
         RECEPTOR     |      BACKBONE      |         BETA        |   1    
 
Raw data: 
     ATP(1):O2A(9) - A:ILE(61):HN(93) - A:ILE(61):N(92) 
 
Hydrophobic contacts (C-C): 
    Sidechain/Backbone | Secondary Structure | Count  
   --------------------|---------------------|------- 
         SIDECHAIN     |        OTHER        |   2    
         SIDECHAIN     |         BETA        |   23   
 
Raw data: 
     ATP(1):C39(3) - A:TYR(58):CD2(67) 
     ATP(1):C39(3) - A:TYR(58):CE2(69) 
     ATP(1):C59(6) - A:ILE(61):CD1(100) 
     ATP(1):C59(6) - A:LYS(87):CE(344) 
     ATP(1):C4(23) - A:PHE(209):CD1(1562) 
     ATP(1):C4(23) - A:PHE(209):CE1(1564) 
     ATP(1):C2(26) - A:PHE(209):CD2(1563) 
     ATP(1):C6(28) - A:PHE(209):CB(1560) 
     ATP(1):C6(28) - A:PHE(209):CG(1561) 
     ATP(1):C6(28) - A:PHE(209):CD1(1562) 
     ATP(1):C6(28) - A:VAL(286):CG2(2266) 
 
pi-pi stacking interactions: 
     ATP(1):C8(30) - A:LYS(87):CG(342) 
     ATP(1):C8(30) - A:GLU(159):CD(1066) 
     ATP(1):C8(30) - A:PHE(209):CE1(1564) 

我写了一个函数来提取 block :

from itertools import islice 
 
def start_end_points(file_name): 
 
 
    f = open(file_name) 
    lines = f.readlines() 
 
    for s, line in enumerate(lines): 
        if "Hydrogen bonds:" in line: 
            print s 
 
    for e, line in enumerate(lines): 
        if "pi-pi stacking interactions:" in line: 
            print e 
 
    print islice(lines, s, e)  
 
start_end_points("foo.txt") 

有没有办法更有效地编写这段代码?因为我想将此代码用作 Web 工具的一部分,因此代码的效率非常重要。

谢谢。

请您参考如下方法:

你没有理由将整个文件加载到内存中!

def start_end_points(file_name): 
    with open(file_name) as f: 
        found = False 
        for line in f: 
            if found or ("Hydrogen bonds:" in line): 
                found = True 
                print line 
            if "pi-pi stacking interactions:" in line: 
                break 
 
start_end_points("foo.txt") 

这样一来,您只在内存中保留一个缓冲区,每行处理一次,并在到达 pi-pi... 行后立即停止读取文件。