使用python分析结果

2024-05-15 23:20:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python的初学者(我是生物学家),我有一个文件,其中包含了一个特定软件的结果,我想使用Python解析结果。从下面的输出中我只想得到分数,并想把序列分成单个氨基酸。

编号得分顺序

1   0.273778    FFHH-YYFLHRRRKKCCNNN-CCCK---HQQ---HHKKHV-FGGGE-EDDEDEEEEEEEE-EE--
2   0.394647    IIVVIVVVVIVVVVVVVVVV-CCCVA-IVVI--LIIIIIIIIYYYA-AVVVVVVVAAAAV-AST-
3   0.456667        FIVVIVVVVIXXXXIGGGGT-CCCCAV -------------IVBBB-AAAAAA--------AAAA-  
4   0.407581    MMLMILLLLMVVAIILLIII-LLLIVLLAVVVVVAAAVAAVAIIII-ILIIIIIILVIMKKMLA-
5   0.331761    AANSRQSNAAQRRQCSNNNR-RALERGGMFFRRKQNNQKQKKHHHY-FYFYYSNNWWFFFFFFR-
6   0.452381    EEEEDEEEEEEEEEEEEEEE-EEEEESSTSTTTAEEEEEEEEEEEE-EEEEEEEEEEEEEEEEE-
7   0.460385    LLLLLLLLMMIIILLLIIII-IIILLVILMMEEFLLLLILIVLLLM-LLLLLLLLLLVILLLVL-
8   0.438680    ILILLVVVVILVVVLQLLMM-QKQLIVVLLVIIMLLLLMLLSIIIS-SMMMILFFLLILIIVVL-
9   0.393291    QQQDEEEQAAEEEDEKGSSD-QQEQDDQDEEAAAHQLESSATVVQR-QQQQQVVYTHSTVTTTE-

从上表中,我想得到一个相同数字、分数但序列分开的表(柱状) 所以看起来应该是

^{pr2}$

另一个表,表示第二列氨基酸

^{pr3}$

第三表为氨基酸第三列,第4列氨基酸等第4列

提前感谢您的帮助


Tags: 文件软件顺序序列分数编号初学者生物学家
3条回答

我不认为创建表格有用。
只需将数据放入一个经过调整的结构中,并使用一个函数来显示您在需要时所需的内容:

with open('bio.txt') as f:
    data = [line.rstrip().split(None,2) for line in f if line.strip()]


def display(data,nth,pat='%-6s  %-15s  %s',uz=('th','st','nd','rd')):
    print pat % ('no.','score',
                 'amino acid(%d%s column)' %(nth,uz[0 if nth//4 else nth]))
    print '\n'.join(pat % (a,b,c[nth-1]) for a,b,c in data)    

display(data,1)
print
display(data,3)
print
display(data,7)

结果

^{pr2}$

从你的例子来看,我想:

  • 要将每个表保存到不同的结果文件中。在
  • 每个序列有65个字符长
  • 有些序列包含一些必须删除的无意义空白(在您的示例中,第3行)

这是我的代码示例,它从input.dat读取数据并将结果写入result-column-<number>.dat

import re
import sys

# I will write each table to different results-file.
# dictionary to map columns (numbers) to opened file objects:
resultfiles = {}


def get_result_file(column):
    # helper to easily access results file.
    if column not in resultfiles:
        resultfiles[column] = open('result-column-%d.dat' % column, 'w')
    return resultfiles[column]


# iterate over data:
for line in open('input.dat'):
    try:
        # str.split(separator, maxsplit)
        # with `maxsplit`=2 it is more fail-proof:
        no, score, seq = line.split(None, 2)

        # from your example I guess that white-spaces in sequence are meaningless,
        # however in your example one sequence contains white-space, so I remove it:
        seq = re.sub('\s+', '', seq)

        # data validation will help to spot problems early:
        assert int(no), no          
        assert float(score), score
        assert len(seq) == 65, seq

    except Exception, e:
        # print the error and continue to process data:
        print >> sys.stderr, 'Error %s in line: %s.' % (e, line)
        continue  # jump to next iteration of for loop.

    # int(), float() will rise ValueError if no or score aren't numbers
    # assert <condition> will rise AssertionError if condition is False.

    # iterate over each character in amino sequance:
    for column, char in enumerate(seq, 1):
        f = get_result_file(column)
        f.write('%s    %s    %s\n' % (no, score, char))


# close all opened result files:
for f in resultfiles.values():
    f.close()

本例中使用的值得注意的函数:

假设您已经打开了包含此数据的文件f,那么您的示例可以用以下方法复制:

for ln in f:    # loop over all lines
    seqno, score, seq = ln.split()
    print("%s    %s    %s" % (seqno, score, seq[0]))

要拆分序列,您需要另外循环seq中的字母:

^{pr2}$

这将打印序列号并多次得分。我不确定你是不是想要那样。在

相关问题 更多 >