在Python中提取部分分块数据

时间:2014-11-12 03:07:56

标签: python parsing

我的数据如下:

INFO  : Reading PDB list file 'model3.list'
INFO  : Successfully read 10 / 10 PDBs from list file 'model3.list'
INFO  : Successfully read 10 Chain structures
INFO  : Processed 40 of 45 MAXSUBs
INFO  : CPU time = 0.02 seconds
INFO  : ======================================
INFO  : 3D-Jury (Threshold: >    10 pairs @ > 0.200)
INFO  : ======================================
INFO  : Rank     Model    Pairs       File
INFO  :     1 :        1      151       pdbs2/model.165.pdb
INFO  :     2 :        7      145       pdbs2/model.150.pdb
INFO  :     3 :        6      144       pdbs2/model.144.pdb
INFO  :     4 :        9      142       pdbs2/model.125.pdb
INFO  :     5 :        4      137       pdbs2/model.179.pdb
INFO  :     6 :        8      137       pdbs2/model.191.pdb
INFO  :     7 :       10      137       pdbs2/model.147.pdb
INFO  :     8 :        3      135       pdbs2/model.119.pdb
INFO  :     9 :        5      131       pdbs2/model.118.pdb
INFO  :    10 :        2      129       pdbs2/model.128.pdb
INFO  : ======================================
INFO  : Pairwise single linkage clustering
INFO  : ======================================
INFO  : Hierarchical Tree
INFO  : ======================================
INFO  : Node     Item 1   Item 2      Distance
INFO  :     0 :        6        1        0.476  pdbs2/model.144.pdb  pdbs2/model.165.pdb
INFO  :    -1 :        7        4        0.484  pdbs2/model.150.pdb  pdbs2/model.179.pdb
INFO  :    -2 :        9        2        0.576  pdbs2/model.125.pdb  pdbs2/model.128.pdb
INFO  :    -3 :       -2        0        0.598
INFO  :    -4 :       10       -3        0.615  pdbs2/model.147.pdb
INFO  :    -5 :       -1       -4        0.618
INFO  :    -6 :        8       -5        0.620  pdbs2/model.191.pdb
INFO  :    -7 :        3       -6        0.626  pdbs2/model.119.pdb
INFO  :    -8 :        5       -7        0.629  pdbs2/model.118.pdb
INFO  : ======================================
INFO  : 1 Clusters @ Threshold  0.800 (0.8)
INFO  : ======================================
INFO  : Item     Cluster
INFO  :     1 :        1                        pdbs2/model.165.pdb
INFO  :     2 :        1                        pdbs2/model.128.pdb
INFO  :     3 :        1                        pdbs2/model.119.pdb
INFO  :     4 :        1                        pdbs2/model.179.pdb
INFO  :     5 :        1                        pdbs2/model.118.pdb
INFO  :     6 :        1                        pdbs2/model.144.pdb
INFO  :     7 :        1                        pdbs2/model.150.pdb
INFO  :     8 :        2                        pdbs2/model.191.pdb
INFO  :     9 :        2                        pdbs2/model.125.pdb
INFO  :    10 :        2                        pdbs2/model.147.pdb
INFO  : ======================================
INFO  : Centroids
INFO  : ======================================
INFO  : Cluster  Centroid  Size        Spread
INFO  :     1 :        1       10        0.566  pdbs2/model.165.pdb
INFO  :     2 :        10       3        0.777  pdbs2/model.147.pdb
INFO  : ======================================

它构成了更多数据的一大块。 块用起始线表示

INFO  : Reading PDB list file 'model3.list'

我想要做的是在这里提取部分块:

INFO  : ======================================
INFO  : Cluster  Centroid  Size        Spread
INFO  :     1 :        1       10        0.566  pdbs2/model.165.pdb
INFO  :     2 :        10       3        0.777  pdbs2/model.147.pdb
INFO  : ======================================

在一天结束时,字典看起来像这样:

{1:"10 pdbs2/model.165.pdb", 
 2:"3 pdbs2/model.147.pdb"}

即使用簇号作为键,值为簇大小+ file_model名称。

在Python中实现这一目标的方法是什么?

我坚持使用这段代码:

import csv
import json
import os
import argparse
import re

def main():
    """docstring for main"""
    file = "max_cluster_output.txt"

    with open(file, 'r') as tsvfile:
        tabreader = csv.reader(tsvfile, delimiter=' ')

        for line in tabreader:
            linelen = len(line)
            if "Centroids" in line:
                print line
                #if linelen >= 32 and linelen <= 34:
                #    print linelen, line


if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:1)

我会用正则表达式来做这件事。

我会有一个外循环

  • 读取行,直到找到“INFO:读取PDB列表文件”

  • 读取行,直到找到“INFO:Cluster Centroid Size Spread”

  • 内循环:

    • 从每个后续行创建字典条目,直到该行不再匹配

      INFO: <number> : <number> <number> <number> <string>

它看起来像这样(未经测试):

import re

FILENAME = "foo.txt"

info = {}

try:
    with open(FILENAME) as f:
        while True:
            for line in f:
                if re.match("^INFO\s+:\s+Reading PDB list file", line):
                    break

            for line in f:
                if re.match("^INFO\s+:\s+Cluster\s+Centroid\s+Size\s+Spread", line):
                    break

            # We're up to the data

            for line in f:
                # look for INFO : Cluster-number Centroid-number Size-number spread-blah File-string
                match = re.match(^INFO\s+:\s+(?P<Cluster>\d+)\s+\d+\s+(?P<Size>\d+).*\s(?P<FileName>\S+)$, line)
                if match:
                    info[match.group("Cluster")] = "%s %s" % (match.group('Size'), match.group("FileName"))
                else:
                    break

except StopIteration:
    print "done"

此代码仅用于显示要使用的事物类型(循环,文件迭代器,破坏,正则表达式)......它绝不是最优雅的方式(并且未经过测试)。