首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >裁剪FASTA基因序列的字典文件定义区域

裁剪FASTA基因序列的字典文件定义区域
EN

Stack Overflow用户
提问于 2022-09-30 23:08:59
回答 2查看 80关注 0票数 0

非常新的Python和编码在一般情况下,所以请随意笑。我想使用以下格式的txt文件(dict),第一列中有基因和序列的区域(起始位置、结束位置)

代码语言:javascript
复制
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)}

代码语言:javascript
复制
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’谢谢!

EN

回答 2

Stack Overflow用户

发布于 2022-09-30 23:19:57

您正在将映射应用于文件对象。你必须这样做:

代码语言:javascript
复制
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()]

希望我能帮上忙

票数 0
EN

Stack Overflow用户

发布于 2022-10-01 00:37:30

显然in 908947.3不是你用第一步建立的ID

因此,当您尝试执行ranges[r.id]时,它不存在并引发错误。

也许你可以做些更像

代码语言:javascript
复制
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在您的第一步中)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73914711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档