我有一个大文本文件,例如这个小例子:
小例子:
>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
您知道如何解决吗?
答案 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)