非常新的Python和编码在一般情况下,所以请随意笑。我想使用以下格式的txt文件(dict),第一列中有基因和序列的区域(起始位置、结束位置)
ORFB 21563 25384
ORF3a 25393 26220
ORF2a 26245 26472
ORF10 29558 29674
S 21563 25384
E 26245 26472从Genbank (GENE.fasta.txt)读取一个FASTA文件,以便输出的是基因名,然后是每个基因的起始和终止之间的序列。以下是FASTA文件的开头
严重急性呼吸综合征冠状病毒2株武汉-Hu-1,全基因组
所以对于ORFB 21563 25384,我想选择并打印ORF3a 25393 26220的21563到25384之间的DNA代码,我想选择并打印25393到26220之间的DNA代码等等。
我试过以下几种方法。
以open('dict.txt')作为f: range= {ID:(int(start),int( stop ))表示ID,start,stop in map(lambda : s.strip().split(),f)}
from Bio import SeqIO
with open ('GENE.fasta.txt') as handle:
out = [r[slice(*ranges[r.id])] for r in SeqIO.parse(handle, 'fasta')]
with open('output.fasta', 'w') as handle:
SeqIO.write(out, handle, 'fasta')但是我一直收到KeyError:‘But 908947.3’谢谢!
发布于 2022-09-30 23:19:57
您正在将映射应用于文件对象。你必须这样做:
with open('dict.txt') as f:
ranges = {
ID: (int(start), int(stop))
for ID, start, stop
in map(lambda line: line.strip().split(), f.readlines())
}readlines方法返回文件中的行列表。使用列表理解可能更易读:[line.strip().split() for line in f.readlines()]
希望我能帮上忙
发布于 2022-10-01 00:37:30
显然in 908947.3不是你用第一步建立的ID
因此,当您尝试执行ranges[r.id]时,它不存在并引发错误。
也许你可以做些更像
with open ('GENE.fasta.txt') as handle:
out = [r[slice(*ranges[r.id])] for r in SeqIO.parse(handle, 'fasta') if r.id in ranges]这只会得到你在第一步确定的范围..。您可能没有正确地构建您的if,但是您的问题中没有足够的信息来断言任何其他信息,这也可能是它可能失败的原因(如果您认为in 908947.3在您的第一步中)。
https://stackoverflow.com/questions/73914711
复制相似问题