【问题标题】:Python 'for loop' to parse resultsPython“for循环”解析结果
【发布时间】:2013-11-22 06:02:54
【问题描述】:

我是一个 Python 初学者(尝试学习生物信息学),我很难正确地完成我的最终“for 循环”。我使用基于网络的生物信息学程序来评估某些蛋白质的亚细胞定位(ORF 中包含的蛋白质名称和序列),我正在尝试解析结果(包含在 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”(即,不是“_”)的条目,以及来自 ORF 的蛋白质名称(标题行)。

我的脚本是:

#!/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()

【问题讨论】:

    标签: python for-loop bioinformatics


    【解决方案1】:

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

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

    这样你就应该做对了。

    【讨论】:

    • 感谢您的帮助。你的修复让我得到了输出,但不幸的是,我仍然没有得到正确的输出(显然是我的错误)。在我的脚本中,所有的 protid 名称都应该在名称列表名称中(每个名称的子集,因为 protid 名称是截断的名称列表名称),但许多名称列表名称不在 protid 中。当我运行我的脚本时,我得到的输出包括不在 protid 中但在名称列表中的名称/序列。你知道为什么会这样吗?
    • 是的,缩进 protfile.write bla bla bla 使其位于 if 条件内。否则,即使它不满足 if 语句,它也会为每个 i 运行。
    • 再次感谢。我尝试过这种方法,但我的输出只有 3 个序列,而应该是 >700。所以,我只有 3 个满足条件的 protid 名称,即使所有 protid 名称都是从名称列表中的名称派生的。还有什么我做错的事情很明显吗?有什么方法可以显示我正在使用的文件以便更好地解决问题?抱歉所有问题 - 我还不擅长这个!
    • 嗨,我已经更新了我的问题,以便更好地说明我正在尝试做的事情。再次感谢您帮助我。
    • 嗯,我看了一点,你说你想得到所有带有 M inpos.57 的条目;而在你的代码中你写的是:if entry[57] !='M'。不应该是 == 'M' 吗??
    猜你喜欢
    • 2018-09-06
    • 1970-01-01
    • 2017-09-30
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2015-05-05
    相关资源
    最近更新 更多