2013-09-03 6 views
0

Я хотел бы решить мою проблему, которая: Когда условия выполняются для моей линии, распечатать все строки начиная с этой линией вплоть до этой линии + значенияPython печать линии от до

У меня есть код глядя, как это:

import re 
## 
def round_down(num): 
    return num - (num%100000) ###reduce search space 
## 
## 
##def Filter(infile, outfile): 
##out = open(outfile,'w') 
infile = open('AT_rich','r') 
cov = open('30x_good_ok_bad_0COV','r') ###File with non platinum regions 
#platinum_region = [row for row in Pt] 
platinum_region={} ### create dictionary for non platinum regions. Works fast 
platinum_region['chrM']={} 
platinum_region['chrM'][0]=[] 
ct=0 
for region in infile: 
    (chr,start,end,types,length)= region.strip().split() 
    start=int(start) 
    end=int(end) 
    length = int(length) 
    rounded_start=round_down(start) 
## 
    if not (chr in platinum_region): 
     platinum_region[chr]={} 
    if not (rounded_start in platinum_region[chr]): 
     platinum_region[chr][rounded_start]=[] 
    platinum_region[chr][rounded_start].append({'start':start,'end':end,'length':length}) 
## 
##c=0 
for vcf_line in cov: ###process file with indels 
## if (c % 1000 ==0):print "c ",c 
## c=c+1 
    vcf_data = vcf_line.strip().split() 
    vcf_chrom=vcf_data[0] 
    vcf_pos=int(vcf_data[1]) 
    vcf_end=int(vcf_data[2]) 
    coverage = int(vcf_data[3]) 
    rounded_vcf_position=round_down(vcf_pos) ###round positions to reduce search space 
## print vcf_chrom 
    ## for vcf_line in infile: ###process file with indels 
## if (c % 1000 ==0):print "c ",c 
    overlapping = 'false' 
    if vcf_chrom in platinum_region and rounded_vcf_position in platinum_region[vcf_chrom]: 
     for region in platinum_region[vcf_chrom][rounded_vcf_position]: 
      if (vcf_pos == region['start']):# and vcf_end == region['end']):# and (vcf_end > region['start'] and vcf_end < region['end']): 
       if vcf_chrom != 'chrX' and vcf_chrom != 'chrY': 
        print vcf_data 

файлы просто набор интервалов запуска конец, первый столбец [0] conatins хромосомный ex.'chr1' :

сОУ:

chr1 1 3 AT_rich 3 
chr1 5 8 AT_rich 4 
chr1 10 12 AT_rich 3 

последний столбец является областью [ 'длина']

входной_файл:

chr1 1 2 4247 
chr1 2 3 4244 
chr1 3 5 4224 
chr1 5 7 4251 
chr1 7 8 4251 
chr1 8 12 4254 
chr1 12 15 4253 

выход будет:

chr1 1 2 4247 
chr1 2 3 4244 
chr1 5 7 4251 
chr1 7 8 4251 
chr1 8 12 4254## here there isn't really start-start matching position, but there is an overlap between two files 
chr1 12 15 4253 

поэтому основная идея заключается в том, если область из одного файла (cov) начинается с позиции области из второго файла (infile). Распечатайте все позиции, начиная с этой исходной позиции вверх до длины области из первого файла (cov). Иногда нет точного совпадающего положения, просто некоторые совпадения, поэтому в этом случае мы, возможно, не заботимся о них (хотя было бы неплохо также иметь их на выходе)

Я хотел бы печатать строки, начинающиеся с vcf_data (при выполнении условий) до vcf_data + region ['length']. Как добавить это в мой код?

+1

Не могли бы вы добавить в качестве примера строки, которые вы хотите распечатать? Каково правило выбора начальной и конечной строк? –

+0

Я отредактировал код. В основном все, что я имею в виду, это печатать строки в infile из моего региона ['start'] до следующей области ['length'] lines – Irek

ответ

1

Добавить это условие цикла:

if region_count > 0: 
    region_count -= 1 
    print line 

Перед цикла:

region_count = 0 

И внутри "условие было выполнено", но до нового состояния блока выше:

region_count = region['length'] 
+0

Я не совсем понимаю, что это делает. Я хочу только распечатать из строки, начинающейся с региона ['start'], до следующей строки в дальности до области ['length']. Так что, если моя область vcf_pos == ['start'] и область ['length'] == в этом случае, скажем, 20, напечатайте следующие 20 строк из infile. Итак, что-то, что работает как string [start: end], но вертикально – Irek

+0

Я предполагаю, что вы читаете файл по строкам. Итак, все, что вам нужно, это счетчик, который говорит «напечатайте каждую строку, пока мне не станет 0». –

1

Я не совсем понимаю ваш формат ввода и вывода, но из вашего описания, я думаю, вы можете сделать что-то вроде t его:

lines = string.split('\n') # Put the content into array of lines 
for idx, line in enumerate(lines): # Iterate over the lines, with the index 
    if condition(line): # If the line fulfill a condition 
     print lines[idx:idx+length] # Print the line range 
Смежные вопросы