我如何编辑我的 python 脚本以便它可以 select 一个 fasta 序列的整个文本?

How can i edit my python script so it can select the whole text of a fasta sequence?

我有2个文件:一个是包含一系列ID的文本文件,另一个是包含与第一个文件中的ID对应的fasta序列的multifasta文件。我有一个 python 脚本,可以 select 来自两个文件的匹配 ID。它看起来像这样:

from Bio import SeqIO

fasta=SeqIO.parse("fasta1.fasta","fasta")
seq_dict={}

for record in fasta:
    seq_dict[record.id]=record.seq

#print (seq_dict)
for line in open("names","r"):
    line=line.strip()
    print(line)

for cle in seq_dict.keys():
    print(cle)

我需要编辑我的脚本,以便它可以 select 相应 ID 旁边的序列文本。你能帮我做吗?谢谢。

如果您只想从 names 文件中提取项目,首先将名称读入内存可能更有效。

from Bio import SeqIO

wanted = dict()
with open("names","r") as lines:
    for line in lines:
        wanted[line.strip()] = 1

for record in SeqIO.parse("fasta1.fasta","fasta"):
    if record.id in wanted:
        print(record.seq)

看看这是否有效:

from Bio import SeqIO

fasta=SeqIO.parse("fasta1.fasta","fasta")
seq_dict = {}

for record in fasta:
    seq_dict[record.id.strip()] = record.seq

with open("names","r") as lines:
    for line in lines:
        l = line.strip().lstrip('<')
        if l in seq_dict:
            print(l) # ID
            print(seq_dict[l])  # sequence

注意这里假设从fasta文件中获取的ID与name文件中的ID相同。如果不是这种情况,请进一步详细说明这两个文件分别包含的内容(带示例)

在玩了 Bio.SeqIO 之后,我得出结论,@Bazingaa 可能是正确的。像这样调整您的代码:

from Bio import SeqIO

fasta=SeqIO.parse("fasta1.fasta","fasta")
seq_dict={}

for record in fasta:
    seq_dict[record.id]=record.description

#print (seq_dict)
for line in open("names","r"):
    line=line.strip()
    print(line)

for cle, desc in seq_dict.items():
    print(cle)
    print(desc)                                                                                                       

您似乎是 python 的新手,所以我是这样做的:

  • 我没有保留 record.seq,而是存储了 record.description
  • for a, b in <some dictionary>.items() 将遍历字典项返回键值对到 a, b 变量

希望对您有所帮助。

编辑:

这里有一个 "pythonic" 版本。我真的不明白 fasta 是什么,所以我假设你想从名字中读取行,将 'tr|something|something' 部分作为 ids(没有前导 '>')并打印出 [=31= 中的那些] 如果他们在名字中:

from Bio import SeqIO

fasta = SeqIO.parse("fasta1.fasta","fasta")

# read all the names
with open("names", "r") as f:  # this takes care to close the file afterwards
  names = [line.strip().lstrip('>') for line in f]
print("Names: ", names)

for record in fasta:
    print("Record:", record.id)
    if record.id in names:                                                                                            
        print("Matching record:", record.id, record.seq, record.description)