Python'for loop'来解析结果

时间:2013-11-21 07:56:40

标签: python for-loop bioinformatics

我是一个初学python用户(试图学习生物信息学),我很难让我的最终'for loop'正确。我使用基于网络的生物信息学程序来评估某些蛋白质的亚细胞定位(蛋白质名称和ORFs中包含的序列),我试图解析结果(包含在targetp中)。我使用的基于网络的程序截断了蛋白质的名称(并不包括序列),我想解析我的结果文件,以便我有FASTA格式的每种蛋白质的完整名称和序列(这需要在一行上具有'>'+ +蛋白质名称,在后续行上具有蛋白质序列)。我认为在最后一段代码之前一切都很顺利;我最终得到了正确的蛋白质名称,但它们都附加在相同的序列中。我知道必须有一些简单的事我做错了,但我无法理解。有什么想法吗?

谢谢!

ORFs文件看起来像这样(它是FASTA,但“不应该在那里,只有>”):

“> HsaNP_000700支链酮酸脱氢酶E1,α多肽 MAVAIAAARVWRLNRGLSQAALLLLRQPGARGLARSHPPRQQQQFSSLDDKPQFPGASAEFIDKLEFIQPNVISGIPIYRVMDRQGQIINPSEDPHLPKEKVLKLYKSMTLLNTMDRILYESQRQGRISFYMTNYGEEGTHVGSAAALDNTDLVFGQYREAGVLMYRDYPLELFMAQCYGNISDLGKGRQMPVHYGCKERHFVTISSPLATQIPQAVGAAYAAKRANANRVVICYFGEGAASEGDAHAGFNFAATLECPIIFFCRNNGYAISTPTSEQYRGDGIAARGPGYGIMSIRVDGNDVFAVYNATKEARRRAVAENQPFLIEAMTYRIGHHSTSDDSSAYRSVDEVNYWDKQDHPISRLRHYLLSQGWWDEEQEKAWRKQSRRKVMEAFEQAERKPKPNPNLLFSDVYQEMPAQLRKQQESLARHLQTYGEHYPLDHFDK

“> HsaNP_060914丙酮酸脱氢酶磷酸酶前体 MPAPTQLFFPLIRNCELSRIYGTACYCHHKHLCCSSSYIPQSRLRYTPHPAYATFCRPKENWWQYTQGRRYASTPQKFYLTPPQVNSILKANEYSFKVPEFDGKNVSSILGFDSNQLPANAPIEDRRSAATCLQTRGMLLGVFDGHAGCACSQAVSERLFYYIAVSLLPHETLLEIENAVESGRALLPILQWHKHPNDYFSKEASKLYFNSLRTYWQELIDLNTGESTDIDVKEALINAFKRLDNDISLEAQVGDPNSFLNYLVLRVAFSGATACVAHVDGVDLHVANTGDSRAMLGVQEEDGSWSAVTLSNDHNAQNERELERLKLEHPKSEAKSVVKQDRLLGLLMPFRAFGDVKFKWSIDLQKRVIESGPDQLNDNEYTKFIPPNYHTPPYLTAEPEVTYHRLRPQDKFLVLATDGLWETMHRQDVVRIVGEYLTGMHHQQPIAVGGYKVTLGQMHGLLTERRTKMSSVFEDQNAATHLIRHAVGNNEFGTVDHERLSKMLSLPEELARMYRDDITIIVVQFNSHVVGAYQNQE

targetp文件看起来像这样(M位于第57位,但这里的格式化会将其抛出):

HsaNP_000700 445 0.939 0.020 0.089 M 1
HsaNP_060914 537 0.309 0.073 0.629 _ 4

targetp中最左边的列是标识符(上面每个蛋白质序列中标题行的一部分),我想只返回位置57中带有'M'(即不是'_')的条目,以及来自ORFs的蛋白质名称(标题行)。

我的脚本是:

#!/usr/bin/python

ORFs = open('Human.MitoCarta.fasta', 'U')
targetp = open('MitoCarta_TargetP_combined.out', 'U')
report = targetp.readlines()
protfile = open('mitocarta_no_mTP.fasta','w')
protid = []
seqdict = {}

for seq in ORFs:
    seq = seq.rstrip()
    if seq[0] == '':
        continue
    if seq[0] == '>':
        name = seq[1:]
        seqdict[name] = ''
        continue

    seqdict[name] += seq

for entry in report:
    if entry.startswith('HsaNP'):
        if entry[57] != 'M':
            protid.append(entry[0:20])
            protid = [x.strip(' ') for x in protid]


nameslist = seqdict.keys()
c = 0
for i in protid:
    if i in nameslist[c]:
        protfile.write('>%s\n%s\n\n' % (nameslist[c], seqdict[name]))
        c += 1

protfile.close()

1 个答案:

答案 0 :(得分:1)

是的,你正在写名单[c]和seqdict [name],但你永远不会改变'名字'。因此,如果要获得不同的序列,则需要更改“名称”。你应该写:

protfile.write('>%s\n%s\n\n' % (nameslist[c], seqdict[nameslist[c]]))

这样你应该做对了。