Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用特定步长的窗口提取短序列?_Python_Extract_Extraction_Biopython_Fasta - Fatal编程技术网

Python 如何使用特定步长的窗口提取短序列?

Python 如何使用特定步长的窗口提取短序列?,python,extract,extraction,biopython,fasta,Python,Extract,Extraction,Biopython,Fasta,下面的代码提取窗口大小为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)) :

下面的代码提取窗口大小为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
测试输出示例

>human1
ACCC
>human1
CCGA
>human1
GATT
这个输出的问题是,有一个T被遗漏了,所以在这个例子中,我希望也包括它。我怎样才能得到这个输出?使用反向提取也可以包括从开始到结束提取时可能遗漏的碱基对。有人能帮我吗

预期产量

>human1
ACCC
>human1
CCGA
>human1
GATT
>human1
ATTT
>human1
CGAT    
>human1
CCCG

对于任意窗口大小和任意步长:

fasta='ACCCGATTT'
windowSize=4
step=1
i=0
while (i+windowSize)<=len(fasta):
    currentWindow=fasta[i:i+windowSize]
    print(currentWindow)
    i+=step
WindowsSize=4,step=1时的输出:

ACCC                       
CCCG
CCGA
CGAT
GATT
ATTT

最后一个输出与预期完全相同,排序不同。

对于任何窗口大小和任何步长:

fasta='ACCCGATTT'
windowSize=4
step=1
i=0
while (i+windowSize)<=len(fasta):
    currentWindow=fasta[i:i+windowSize]
    print(currentWindow)
    i+=step
WindowsSize=4,step=1时的输出:

ACCC                       
CCCG
CCGA
CGAT
GATT
ATTT
最后一个与预期的输出完全相同,排序不同。

您可以使用范围的for循环,使用范围的第三步参数。这样,它比使用while循环更干净。如果数据不能除以区块大小,则最后一个区块将更小

data = "ACCCGATTT"
step = 2
chunk = 4
for i in range(0, len(data) - step, step):
    print(data[i:i+chunk])
输出为

ACCC
CCGA
GATT
TTT
您可以使用范围的for循环,使用范围的第三步参数。这样,它比使用while循环更干净。如果数据不能除以区块大小,则最后一个区块将更小

data = "ACCCGATTT"
step = 2
chunk = 4
for i in range(0, len(data) - step, step):
    print(data[i:i+chunk])
输出为

ACCC
CCGA
GATT
TTT

您的特定示例可以通过将步长改为1来解决。但是你的问题似乎是,如果序列中没有足够的字符,我如何从序列的末尾重复相同的窗口大小。因此,这将带来不同的一个例子可能是

AAAATTT
窗口大小为6,步长大小为2,其中您希望aatt来自正向,aaatt来自反向,但不需要其他子序列

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])
显然,向前运行代码一次,向后运行代码一次都可以做到这一点,但它会引入重复,这通常不是一件好事。但是,您可以重构问题,以便将步骤分成两个步骤

对于步长为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])

您的特定示例可以通过将步长改为1来解决。但是你的问题似乎是,如果序列中没有足够的字符,我如何从序列的末尾重复相同的窗口大小。因此,这将带来不同的一个例子可能是

AAAATTT
窗口大小为6,步长大小为2,其中您希望aatt来自正向,aaatt来自反向,但不需要其他子序列

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])
显然,向前运行代码一次,向后运行代码一次都可以做到这一点,但它会引入重复,这通常不是一件好事。但是,您可以重构问题,以便将步骤分成两个步骤

对于步长为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])

看到预期的输出,您似乎希望将窗口移动步长1,而不是2。我说的对吗?实际上是步长2。看到预期的输出,似乎您希望将窗口移动步长1,而不是2。我说的对吗?实际上是第二步。