繁体   English   中英

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

[英]How can I count the line number between two character in a file with python?

嗨,我是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-

我想计算* **** contig# 之间的非空行数 ** * * ,我想得到这样的结果

contig1=2
contig2=3
contig3=2**

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

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]

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 \\vblank space )。 当有字符串作为参数时,将从已处理的字符串中删除在已处理字符串中找到的字符串参数中存在的所有字符。 字符串参数中字符的顺序无关紧要:这样的参数并不指定字符串,而是要删除的一组字符。

line.strip()是一种了解行中是否存在非空格字符的方法

这一事实elif line.strip():是行之后位于if 'Contig' in line: ,那它是写的elif并没有如果 ,是很重要的:如果是相反的, line.strip()将是真实的以线为例

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

我想您将有兴趣了解像这样的行的内容:

            E_264+ is in E_254+

因为正是这种类型的行在计数上有所不同,所以我编辑了我的代码,以使功能give()也会产生这种类型的行的信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM