我是一个初学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()
答案 0 :(得分:1)
是的,你正在写名单[c]和seqdict [name],但你永远不会改变'名字'。因此,如果要获得不同的序列,则需要更改“名称”。你应该写:
protfile.write('>%s\n%s\n\n' % (nameslist[c], seqdict[nameslist[c]]))
这样你应该做对了。