python - 主字符串 python/biopython 中的现有子字符串没有输出
问题描述
如果主字符串的特定部分存在子字符串,我会构建一个代码来打印字符串。我有一个如下文件,我从seq11_rv
.
>seq11_fw
TCAGATGTGTATAAGAGACAGTTATTAGCCGGTTCCAGGTATGCAGTATGAGAA
>seq11_rv
GAGATTATGTGGGAAAGTTCATGGAATCGAGCGGAGATGTGTATAAGAGACAGTGCCGCGCTTCACTAGAAGTCATACTGC
然后我对这些 5mers 进行反向补码并将它们附加到一个列表中。然后我查看了seq11_fw
如果位置[42:51]
(seq11_fw 中的 GCAGTATGA)有任何列表项,则应打印确认。
为了便于理解最后一个 5merseq11_rv
是ACTGC
它的反向补码GCAGT
,如果你检查seq11_fw[42:51]
它是否GCAGT
存在于该位置,但我没有得到任何输出。
任何帮助,将不胜感激。
这是我的代码:
from Bio import SeqIO
from Bio.Seq import Seq
with open(file, 'r') as f:
lst = []
for record in SeqIO.parse(f, 'fasta'):
if len(record.seq) == 81:
for i in range(len(record.seq)):
kmer = str(record.seq[i:i + 5])
if len(kmer) == 5:
C_kmer = Seq(kmer).complement()
lst.append(C_kmer[::-1])
cnt=0
if len(record.seq) == 54 and any(str(items) in str(record.seq[42:51]) for items in lst):
cnt +=1
if cnt == 1:
print(record.id)
print(record.seq)
print(lst)
解决方案
这似乎可行,问题是您设置算法的方式:
from Bio import SeqIO
from Bio.Seq import Seq
file ='test.faa'
with open(file, 'r') as f:
lst = []
for record in SeqIO.parse(f, 'fasta'):
if len(record.seq) == 81:
for i in range(len(record.seq)):
kmer = str(record.seq[i:i + 5])
if len(kmer) == 5:
C_kmer = Seq(kmer).complement()
lst.append(C_kmer[::-1])
with open(file, 'r') as f:
cnt=0
for record in SeqIO.parse(f, 'fasta'):
if len(record.seq) == 54 and any(str(items) in str(record.seq[41:52]) for items in lst):
cnt +=1
if cnt == 1:
print(record.id)
print(record.seq)
cnt = 0
在这个版本中,你迭代你的输入文件两次:
第一次创建 5mers 列表
第二个检查列表中长度 = 54 的 record.seq 的 [41:52]。
您需要将计数器 cnt 重置为零,否则将打印所有序列
如果您打算拥有一个包含多个序列的测试文件,我会尝试让一个输入文件包含正向序列,一个输入文件包含反向序列,具有相同的顺序。然后我会检查每对并行循环两个文件的夫妇。不知道怎么做,但这里有很多很好的例子:
我相信您需要将 SeqIO.parse 的两条记录读入两个列表,然后像这样使用它们:
from Bio import SeqIO
from Bio.Seq import Seq
file1 ='test_fw.faa'
file2 ='test_rv.faa'
record1_lst = []
record2_lst = []
with open(file1, 'r') as f1:
for record in SeqIO.parse(f1, 'fasta'):
record1_lst.append(record)
with open(file2, 'r') as f2:
for record in SeqIO.parse(f2, 'fasta'):
record2_lst.append(record)
for record_fw, record_rv in zip(record1_lst, record2_lst):
print(record_fw.id, record_rv.id)
或者像这样工作,记住在解析器迭代器被清空后关闭文件:
from Bio import SeqIO
from Bio.Seq import Seq
file1 ='test_fw.faa'
file2 ='test_rv.faa'
f1 = open(file1, 'r')
f2 = open(file2, 'r')
record1 = SeqIO.parse(f1, 'fasta')
record2 = SeqIO.parse(f2, 'fasta')
for record_fw, record_rv in zip(record1, record2):
print(record_fw.id, record_rv.id)
f1.close()
f2.close()
推荐阅读
- vue.js - 为什么我在 nuxtjs 中收到关于 eslint-module 的 Nuxt 致命错误?
- python - 如何反向打印字符串的一部分?
- javascript - javascript不会发出网络请求
- api - 如何修复我的 console.log 的“错误查询”消息?
- r - 无法使用 here() 进入正确的项目目录
- python - 模型并行性,Pytorch 中的 CUDA 内存不足
- c# - How to return the not-cancelled tasks from Task.WhenAll execution
- java - Spring Boot 只初始化一个数据源,而不初始化另一个
- python - 如何从 csv 文件中读取姓名和成绩并将它们的平均值写入另一个 csv 文件?
- docker - 容器化 Vue 应用程序不会在 localhost 上显示网页