如何用python计算文件中两个字符之间的行号?

时间:2011-05-13 08:20:02

标签: python count line

您好 我是python的新手,我有一个3.2 python! 我有一个文件,其格式如下:

Number of segment pairs = 108570; number of pairwise comparisons = 54234
'+' means given segment; '-' means reverse complement

Overlaps            Containments  No. of Constraints Supporting Overlap

******************* Contig 1 ********************

 E_180+

 E_97-

******************* Contig 2 ********************

E_254+

                    E_264+ is in E_254+

E_276+

******************* Contig 3 ********************

E_256-

E_179-

我想计算 * **** 重叠群# ** * * 我希望得到像这样的结果

contig1=2
contig2=3
contig3=2**

2 个答案:

答案 0 :(得分:3)

可能最好在这里使用正则表达式。您可以尝试以下方法:

import re
str = open(file).read()
pairs = re.findall(r'\*+ (Contig \d+) \*+\n([^*]*)',str)

pairs是元组列表,其中元组的格式为('Contig x', '...') 每个元组的第二个组件包含标记后面的文本

之后,您可以计算这些文本中'\n'的数量;最容易这可以通过列表理解来完成:

[(contig, txt.count('\n')) for (contig,txt) in pairs]

(编辑:如果您不想计算空行,可以尝试:

[(contig, txt.count('\n')-txt.count('\n\n')) for (contig,txt) in pairs]

答案 1 :(得分:1)

def give(filename):
    with open(filename) as f:
        for line in f:
            if 'Contig' in line:
                category = line.strip('* \r\n')
                break
        cnt = 0
        aim = []
        for line in f:
            if 'Contig' in line:
                yield (category+'='+str(cnt),aim)
                category = line.strip('* \r\n')
                cnt = 0
                aim= []
            elif line.strip():
                cnt+=1
                if 'is in' in line:
                    aim.append(line.strip())
        yield (category+'='+str(cnt),aim)


for a,b in give('input.txt'):
    print a
    if b:  print b

结果

Contig 1=2
Contig 2=3
['E_264+ is in E_254+']
Contig 3=2

函数give()不是正常函数,它是生成函数。请参阅文档,如果您有疑问,我会回答。

strip()是一个消除字符串开头和结尾的字符的函数

如果在没有参数的情况下使用,strip()会删除空格(即\f \n \r \t \v和{{1} }})。当有一个字符串作为参数时,将从处理过的字符串中删除在处理过的字符串中找到的字符串参数中存在的所有字符。字符串参数中的字符顺序无关紧要:这样的参数不指定字符串,而是指定要删除的字符集。

blank space是一种了解行中是否有空格的方法

line.strip()位于行elif line.strip():之后,并且写为 elif 而不是如果,这一事实非常重要:恰恰相反,if 'Contig' in line:为真以换行

line.strip()

我想您有兴趣知道这一行的内容:

******** Contig 2 *********\n

因为正是这种线在计数方面有所不同 所以我编辑了我的代码,以便函数 E_264+ is in E_254+ 也生成这些行的信息