【问题标题】:pattern finding in python and report as a tab separated text file在 python 中查找模式并报告为制表符分隔的文本文件
【发布时间】:2018-12-19 15:10:34
【问题描述】:

我有一个像这个小例子这样的大文本文件:

小例子:

>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 列的文本文件。

第一列:是短序列开始的位置(每第二部分有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

你知道怎么解决吗?

【问题讨论】:

  • 您好,在您的代码中:line.startswith('<');你的意思是line.startswith('>') 吗?
  • CCGA 序列能否在一行中出现多次?
  • @Patrick Haugh 是的,这是可能的
  • 我们可以看看你的pattern.finder吗?你为什么要调用它两次,为什么它似乎第一次产生一个可迭代而第二次产生一个位置整数,它是如何提供它应该测试的实际行的?

标签: python


【解决方案1】:

下面使用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)

【讨论】:

  • 我认为它有效。如何将其导出到制表符分隔的文件中?
猜你喜欢
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
相关资源
最近更新 更多