此代码用于从fasta文件中提取和拆分序列
outfile=open('outf','w')
for line in open('input'):
if line[0]==">":
outfile.write('\n')
else:
outfile.write(line.strip())
outfile.close()
all_codons=[]
for line in open('outf', 'r'):
seq=line.strip()
codons = [seq[i:i+3] for i in xrange(0, len(seq), 3) if len(seq[i:i+3])==3]
all_codons.append(codons)
然后,从分裂的序列中我想取三个序列,其长度为9(9个碱基)例如:
CGTAACAAG
AATCCGGAG
CCGCCTCGG
我将第一个序列分成3个碱基的3个子序列,因此,从一个序列中我获得3个子序列,我对其他两个序列做同样的事情。
像这样:
CGT AAC AAG
AAT CCG GAG
CCG CCT CGG
示例:
identical_segment('CGT')
我想将这个函数应用于三个序列的每个子序列,然后在所有fasta文件上应用相同的东西。因此,目的是获得矩阵,例如我采用第一个子序列'CGT'并应用函数identical_segment(),它返回28,其余8个子序列也是如此。所以我得到一个矩阵(3,3):
28 2 3
4 23 35
23 4 27
我该怎么办?
答案 0 :(得分:0)
您的代码中存在一些问题。
首先,您只需要文件中的某些行,抛弃其他行,然后将所需的行输出到文件中。我不确定为什么需要最后一步。直接处理线路效率更高。
def processLines(inputname):
all_codons=[]
for line in open(inputname):
if line[0]==">":
seq=line.strip()
codons = [seq[i:i+3] for i in xrange(0, len(seq), 3) if
len(seq[i:i+3])==3]
all_codons.append(codons)
return all_codons
此外,每次调用same_segment都会生成一个字典,用作从str到分数的映射。呼叫次数可能会变得昂贵。为避免这种情况,您可以尝试两种方法:
code={"a":0,"c":1,"g":2,"t":3}
def identical_segment(input_string):
.... # what you have written
或创建一个实例包含字典的类。
要处理多个文件,请执行以下操作:
output = [processLines(filename) for filename in filenames]
# filenames is an iterable
或者如果要将输入名称映射到输出:
outputDict = {filename: processLines(filename) for
filename in filenames}
毕竟,在每个输出上调用分析函数并将它们写入输出文件。
总结一下你应该在这篇文章中提到的内容:
输出文件可能不是最佳选择,因为文件IO很昂贵。如果你把它写到某个文件中,就意味着你必须再次阅读它,这是非常昂贵的。
不应一遍又一遍地创建同一个对象。校对您的代码以确保不会发生这种情况。
将主要任务划分为几个小任务,然后想出一个简单直观的方法来开始每个任务。在这个例子中,我们有processfiles->分析 - > output_result
理解是在Python中迭代事物的有用方法,它更具可读性。您可以搜索列表理解和字典理解以了解更多信息。
自己尝试一下。我非常乐意在这里阅读您的改进代码。
答案 1 :(得分:0)
尝试使用BioPython从fasta文件中提取核苷酸序列。使用这个包,
from Bio import AlignIO
for record in AlignIO.parse('filename.fasta', 'fasta'):
print record.id, record.seq
# or store in a new file
seqs = []
for record in AlignIO.parse('filename.fasta', 'fasta'):
seqs.append(record.seq + '\n')
with open(outfile, 'w') as out:
out.writelines(seqs)