Выведите строку, если она соответствует AND, если условие выполнено в N строках до и в N строках после - PullRequest
0 голосов
/ 03 марта 2020

Какой самый разумный способ сделать это? После того, как у меня будет матч, я хочу знать, что происходит в 100 строках до и в 100 строках после. Вот пример l oop

 with open(pile, "r") as pileup:
            for i, line in enumerate(pileup):
                fields = line.split('\t')
                if fields[0] == v.CHROM and (v.start -1) == fields[1]:
                        print(str(v)) #printing the query string #I hope that then the variable i has the value of the match line number
                        for line in range(i-101, i+101):
                            if fields[2] >= 4:
                                 print (line)     #here I want to pring the line meeting the condition

Я знаю, использование enumerate должно позволить иметь номер строки. Но мой код не работает, он работает вечно. Спасибо за любые советы

Ответы [ 2 ]

2 голосов
/ 03 марта 2020

Похоже, сейчас самое время использовать деку.

Дек можно использовать как список фиксированной длины. Таким образом, в нем никогда не будет более 100 элементов.

from collections import deque

cache = deque(maxlen=100)
full_list = []

with open(pile, "r") as pileup:
    for line in pileup:
        fields = line.split('\t')

        cache.append(fields)
        if fields[0] == v.CHROM and (v.start -1) == fields[1]:
            break

    # once you reach your condition
    # you can grab the next 100 lines as well
    full_list = list(cache)

    for i, line in enumerate(pileup):
        if i < 100:
            full_list.append(line.split('\t'))
        else:
            break

0 голосов
/ 04 марта 2020

Хорошо, вот код

from collections import deque
from cyvcf2 import VCF, Writer
import numpy
import glob

for file in glob.glob('test.vcf'):
    vcf = VCF(file)
    sample_name = file.split('.')[0]
    out = "{}.StartPurged.vcf".format(sample_name)
    pile = "{}.startStop.pileup".format(sample_name)
    w = Writer(out, vcf)
    for v in vcf:         
        cache = deque(maxlen=100)
        full_list = []

        with open(pile, "r") as pileup:
            for line in pileup:
                fields = line.split('\t')

                cache.append(fields)
                if fields[0] == v.CHROM and (v.start -1) == fields[1]:
                    break

            # once you reach your condition
            # you can grab the next 100 lines as well
            full_list = list(cache)

            for i, line in enumerate(pileup):
                if i < 100:
                    full_list.append(line.split('\t'))
                else:
                    break
            for x in range(len(full_list)):                    
                print (full_list[x])

Единственная проблема в том, что распечатанный список не тот, который я хочу, в файле примера, который я даю, есть строка на chromosome_1 и мой код напечатайте строки из chromosome_33, 34, 35. Теперь это важно, потому что мои хромосомы упорядочены, а те, 33, 34, 35 - последние и представляют собой небольшие фрагменты. Таким образом, сценарий фактически заполняет full_list до самого конца файла накопления.

И мой пример в виде chromosome_1

Есть идеи, что не так? Прошу прощения за нуб вопросы

...