下面的代码在窗口大小为4的每个序列中提取短序列。如何按步长2移动窗口并提取4个碱基对?
示例代码
from Bio import SeqIO
with open("testA_out.fasta","w") as f:
for seq_record in SeqIO.parse("testA.fasta", "fasta"):
i = 0
while ((i+4) < len(seq_record.seq)) :
f.write(">" + str(seq_record.id) + "\n")
f.write(str(seq_record.seq[i:i+4]) + "\n")
i += 2
testA.fasta的输入示例
>human1
ACCCGATTT
testA_out的输出示例
>human1
ACCC
>human1
CCGA
>human1
GATT
这个输出的问题是有一个T被遗漏,所以在这种情况下我希望也包括它。我怎么能得出这个输出?使用反向提取物以及包括从开始到结束提取时可能遗漏的碱基对。任何人都可以帮助我吗?
预期产出
>human1
ACCC
>human1
CCGA
>human1
GATT
>human1
ATTT
>human1
CGAT
>human1
CCCG
答案 0 :(得分:3)
对于任何窗口大小和任何步长:
fasta='ACCCGATTT'
windowSize=4
step=1
i=0
while (i+windowSize)<=len(fasta):
currentWindow=fasta[i:i+windowSize]
print(currentWindow)
i+=step
使用windowSize = 4输出,步骤= 2:
ACCC
CCGA
GATT
使用windowSize = 4输出,步骤= 1:
ACCC
CCCG
CCGA
CGAT
GATT
ATTT
最后一个与“预期输出”完全相同,排序方式不同。
答案 1 :(得分:1)
您可以使用for
的{{1}}循环,使用range
的第三个step
参数。这样,它比使用range
循环更清晰。如果数据不能被块大小分割,那么最后一个块将更小。
while
输出
data = "ACCCGATTT"
step = 2
chunk = 4
for i in range(0, len(data) - step, step):
print(data[i:i+chunk])
答案 2 :(得分:1)
您可以通过转换为1的步长来解决您的特定示例。但是你的问题似乎在问,&#34;如果序列中没有足够的字符,如何从序列末尾重复相同的窗口大小&#34;。所以这会产生影响的例子可能是
AAAATTT
窗口大小为6且步长为2,您希望{&#34;转发&#34;}中的AAAATT
方向和来自&#34;反向&#34;的AAATTT
方向,但没有其他后续。
显然,在向前方向上运行一次代码并在向后方向运行一次会做到这一点,但它会引入重复,这通常不是一件好事。但是,您可以重构问题,以便将步骤分成多个步骤。
对于步长为 y 的长度 x 的序列,您可以将 y 划分为 x%y 和 y-(x%y)然后继续这些成对步骤。 (当 x%y == 0时,跳过该对中的第一个成员。)
我只发布字符串处理函数,因为这些函数都不是基因序列特有的。
seq = "AAAATTT"
window = 6
step = 2
length = len(seq)
modulo = length % step
for i in range(0, length-window, step):
if modulo > 0:
print(seq[i:i+window])
print(seq[i+modulo:i+modulo+window])