Как я могу посчитать номер строки между двумя символами в файле с Python? - PullRequest
2 голосов
/ 13 мая 2011

Привет Я новичок в 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**

Ответы [ 2 ]

3 голосов
/ 13 мая 2011

Вероятно, здесь лучше использовать регулярные выражения.Вы можете попробовать следующее:

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 голос
/ 13 мая 2011
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 и blank space). Если в качестве аргумента есть строка, все символы, присутствующие в аргументе строки, найденные в обработанной строке, удаляются из обработанной строки. Порядок символов в строковом аргументе не имеет значения: такой аргумент обозначает не строку, а набор символов, которые необходимо удалить.

line.strip() - это способ узнать, есть ли символы в строке, не являющиеся пробелами

Важно то, что elif line.strip(): находится после строки if 'Contig' in line: и что оно написано elif , а не , если , важно: если это было наоборот, line.strip() будет True для строки для примера

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

Полагаю, вам будет интересно узнать содержание таких строк:

            E_264+ is in E_254+

потому что именно такая линия меняет счет Поэтому я отредактировал свой код так, чтобы функция give() вырабатывала также информацию такого рода строк

...