python中的模式查找和以制表符分隔的文本形式报告

2024-07-01 07:07:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大的文本文件,比如这个小例子:

小例子:

>chr9:128683-128744
GGATTTCTTCTTAGTTTGGATCCATTGCTGGTGAGCTAGTGGGATTTTTTGGGGGGTGTTA
>chr16:134222-134283
AGCTGGAAGCAGCGTGGGAATCACAGAATGGCCGAGAACTTAAAGGCTTTGCTTGGCCTGG
>chr16:134226-134287
GGAAGCAGCGTGGGAATCACAGAATGGACGGCCGATTAAAGGCTTTGCTTGGCCTGGATTT
>chr1:134723-134784
AAGTGATTCACCCTGCCTTTCCGACCTTCCCCAGAACAGAACACGTTGATCGTGGGCGATA
>chr16:135770-135831
GCCTGAGCAAAGGGCCTGCCCAGACAAGATTTTTTAATTGTTTAAAAACCGAATAAATGTT
>chr16:135787-135848
GCCCAGACAAGATTTTTTAATTGTTTAAAAACCGAATAAATGTTTTATTTCTAGAAAACTG
>chr16:135788-135849
CCCAGACAAGATTTTTTAATTGTTTAAAAACCGAATAAATGTTTTATTTCTAGAAAACTGT
>chr16:136245-136306
CACTTCACAAATAGAAGGCTGTCAGAGAGACAGGGACAGGCCACACAAGTGTTTCTGCACA
>chr7:146692-146753
GTGTGACCAAAACTTAGGATGTTAGCCGAACTCTCCGTTACTATCATTTTGGATTTCCAGT
>chr8:147932-147993
GGTAAAGGTAAATACATAAACAAACATAAAACCGATCCTATTGTAATTTTGGTTTGTAACT

该文件分为不同的组,每个组有2个部分(2行)。以>开头的第一行是ID,第二行是字符序列。每个字符序列的长度是61。 我有一个短序列(也就是CCGA),我想每2部分扫描一次这个短序列。输出将是一个包含两列的文本文件

第1列:是短序列开始的位置(每第2部分有61个字符,因此在输出中我将报告一个数字字符的位置)。 第2列:短序列的开始位于该特定位置的次数

例如,对于以下字符序列,短序列的开头位于49位置

GCCTGAGCAAAGGGCCTGCCCAGACAAGATTTTTTAATTGTTTAAAAACCGAATAAATGTT

对于小示例,预期输出如下所示:

预期产量:

1   0
2   0
3   0
4   0
5   0
6   0
7   0
8   0
9   0
10  0
11  0
12  0
13  0
14  0
15  0
16  0
17  0
18  0
19  0
20  0
21  1
22  0
23  0
24  0
25  0
26  1
27  0
28  0
29  0
30  0
31  1
32  4
33  0
34  0
35  0
36  0
37  0
38  0
39  0
40  0
41  0
42  0
43  0
44  0
45  0
46  0
47  0
48  0
49  1
50  0
51  0
52  0
53  0
54  0
55  0
56  0
57  0
58  0
59  0
60  0
61  0

我尝试用python使用以下代码来实现这一点。但是输出不是我想要的

infile = open('infile.txt', 'r')
ss = 'CCGA'
count = 0
for line in infile:
    if not line.startswith('>'):
        for match in pattern.finder(ss):
            count +=1
            POSITION = pattern.finder(ss)
            COUNT = count

你知道怎么修吗


Tags: inforfindercountline序列字符ss
1条回答
网友
1楼 · 发布于 2024-07-01 07:07:28

下面使用^{}查找CCGA模式的所有非重叠出现,并创建一个从序列开始的索引到序列在该索引处开始的次数的映射

from re import compile
from collections import defaultdict

pat = compile(r'CCGA')
mapping = defaultdict(int)

with open('infile.txt', 'r') as infile:
    for line in infile:
        if not line.startswith('>'):
            for match in pat.finditer(line):
                mapping[match.start() + 1] += 1

for i in range(1, 62):
    print("{:>2} {:>2}".format(i, mapping[i]))

印刷品

 1  0
 2  0
 3  0
 4  0
 5  0
 6  0
 7  0
 8  0
 9  0
10  0
11  0
12  0
13  0
14  0
15  0
16  0
17  0
18  0
19  0
20  0
21  1
22  0
23  0
24  0
25  0
26  1
27  0
28  0
29  0
30  0
31  1
32  4
33  0
34  0
35  0
36  0
37  0
38  0
39  0
40  0
41  0
42  0
43  0
44  0
45  0
46  0
47  0
48  0
49  1
50  0
51  0
52  0
53  0
54  0
55  0
56  0
57  0
58  0
59  0
60  0
61  0

将其导出到文件的一种方法是使用print函数

with open('outfile.txt', 'w+') as outfile:
    for i in range(1, 62):
        print(i, mapping[i], sep='\t', file=outfile)

相关问题 更多 >

    热门问题