我正在尝试编写一个代码来提取fasta文件中最长的ORF。它来自Coursera Genomics数据科学课程。
该文件是一个练习文件:" dna.example.fasta"
数据在这里:https://d396qusza40orc.cloudfront.net/genpython/data_sets/dna.example.fasta
我的部分代码在下面提取阅读框2 (从序列的第二个位置开始。例如:seq:ATTGGG,获取阅读框2:TTGGG):
#!/usr/bin/python
import sys
import getopt
o, a = getopt.getopt(sys.argv[1:], 'h')
opts = dict()
for k,v in o:
opts[k] = v
if '-h' in k:
print "--help\n"
if len(a) < 0:
print "missing fasta file\n"
f = open(a[0], "r")
seq = dict()
for line in f:
line = line.strip()
if line.startswith(">"):
name = line.split()[0]
seq[name] = ''
else:
seq[name] = seq[name] + line[1:]
k = seq[">gi|142022655|gb|EQ086233.1|323"]
print len(k)
该特定序列的长度应为4804bp。因此,通过单独使用此序列,我可以得到正确的答案。 但是,使用代码,在字典中,此特定序列仅变为4736 bp。
我是python的新手,所以我无法理解这些100 bp的去向?
谢谢,
XIO
答案 0 :(得分:1)
再看看你的数据文件
一些行的例子:
gi | 142022655 | gb | EQ086233.1 | 43海洋metagenome JCVI_SCAF_1096627390048基因组支架,全基因组鸟枪序列 TCGGGCGAAGGCGGCAGCAAGTCGTCCACGCGCAGCGCGGCACCGCGGGCCTCTGCCGTGCGCTGCTTGG CCATGGCCTCCAGCGCACCGATCGGATCAAAGCCGCTGAAGCCTTCGCGCATCAGGCGGCCATAGTTGGC
注意序列如何从每行的第一个值开始。
您的添加行seq[name] = seq[name] + line[1:]
在第一个字符后添加该行的所有内容,不包括第一个字符(Python 2指标为零)。事实证明,你缺少的核苷酸数是制造基因组所需的行数,因为你每次都会失去第一个字符。
修改后的方式为seq[name] = seq[name] + line
,只需添加该行而不会丢失第一个字符。
找到这类调试错误的最快方法是在代码中添加一堆打印语句并使用少量文件进行测试 - 您可以看到输出并检查自己是否为&# 39; s出来了。可能有50个核苷酸而不是5000个核苷酸的东西。这就是我在大约5分钟内得出问题答案的方法。
另外为了将来参考,请提及您之前使用的python版本。 python 2(你正在使用的那个)和python 3(更新的版本)之间存在很多差异。
编辑:我对您的代码进行了一些测试,如果您最后得到任何额外的字符,它们可能是空格。确保在每行上使用.strip()
方法,然后将其添加到字符串中,以清除空格。
编辑:根据评论,我将修改此答案的一部分。 要从序列第一行的第二个位置开始,然后使用完整的行直到下面的核苷酸,你可以利用文件的线性格式,只需在if语句中添加一个子句, ELIF。这将测试我们是否在序列的第一行,如果是,请使用从第二行开始的字符,如果我们在任何其他行上,则使用整行。
if line.startswith(">"):
name = line.split()[0]
seq[name] = ''
#If it's the first line in the series, then the dict's value
# will be an empty string, so this elif means "If we're at the
# start of the series..."
elif seq[name] == '':
seq[name] = seq[name] + line[1:]
else:
seq[name] = seq[name]
这种适应将从基因组中的第二个核苷酸开始,而不会丢失核苷酸其余部分中每一个的第一个核苷酸。