在python中找到模式并以制表符分隔的文本文件形式报告

时间:2018-12-19 15:10:34

标签: 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),我想扫描每个第二部分的这个短序列。然后输出将是一个具有两列的文本文件。

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

例如,对于以下字符序列,短序列的开头位于位置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

您知道如何解决吗?

1 个答案:

答案 0 :(得分:2)

以下内容使用finditer查找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)