我需要帮助我的脚本-我已经花了很多时间,但无法调整脚本的方式,以提供预期的输出
我有一个以下格式的文件:
>seq1
ACTGTAG #---> 6mers of this line are ACTGTA & CTGTAG
>seq2
ATAGGAG #---> 6mers of this line are ATAGGA & TAGGAG
>seq3
TCCTATT #---> 6mers of this line are TCCTAT & CCTATT
在我的脚本中,我希望以迭代的方式保存行(在脚本中通过过滤器)。我想从“保存”第一行开始,将该寡聚体的所有反向补码6-聚体读入一个列表。在这个示例文件中,我有两个来自第1行的6mer[m1,m2],它们各自的补码应添加到列表2中[c1,c2](script does this reverse complement conversion correctly)
,当在seq2上迭代时,脚本首先应查看[c1,c2]中是否有任何一个在seq2中,如果是,则应丢弃seq2,否则应保存第2行各自的6mer补码[c3,c4]应添加到列表2中,更新后的列表2应为[c1、c2、c3、c4]
问题是在第三次迭代之后,list1将包含[m1,m2,m3],list2将包含[c1,c1,c2,c1,c2,c3],当我在9000行文件上运行这个脚本时,这会造成一个大问题。如果你能帮我做这件事就太好了
我的代码是:
from Bio import SeqIO
from Bio.Seq import Seq
with open('test.fa', 'r') as file:
list1 = []
list2 = []
for record in SeqIO.parse(file, 'fasta'):
for i in range(len(record.seq)):
kmer = str(record.seq[i:i + 6]) #gets 6 alphabet blocks (6mers)
if len(kmer) == 6:
list1.append(kmer)
#print(record.seq)
#print(list1)
# reverse complement of 6mers and appends to the list2
for kmers in list:
C_kmer = Seq(kmers).complement()
list2.append(C_kmer[::-1])
# print(list2)
cnt = 0
if any(items in record.seq for items in list2):
cnt += 1
if cnt == 0:
print('>' + record.id)
print(record.seq)
print(list2)
所需输出应为: (因为这些行[c1、c2、c3、c4]内没有任何反向补码6mers,但seq3有)
>seq1
ACTGTAG
>seq2
ATAGGAG
清单2应为:
[Seq('TACAGT'), Seq('CTACAG'),Seq('TCCTAT'), Seq('CTCCTA'), Seq('ATAGGA'), Seq('AATAGG')]
但目前,我的列表2如下所示,这是错误的-它重复了前面提到的一些反向补码6mers
[Seq('TACAGT'), Seq('CTACAG'), Seq('TACAGT'), Seq('CTACAG'), Seq('TCCTAT'), Seq('CTCCTA'), Seq('TACAGT'), Seq('CTACAG'), Seq('TCCTAT'), Seq('CTCCTA'), Seq('ATAGGA'), Seq('AATAGG')]
我认为这应该行得通——这是我自己的答案,请给出您的意见
相关问题 更多 >
编程相关推荐