Как извлечь и объединить координаты с помощью Python?

Ниже представлена ​​информация о местоположении 3 последовательностей: название последовательности, начальный и конечный сайты. Я хотел бы обратиться к точному местоположению сайтов. Например, значение 785 на самом деле означает, что начальный сайт начинает отсчет с местоположения 27860291 и заканчивается 789, что на самом деле равно 27861079. Может кто-нибудь помочь мне?

Код

from Bio import SeqIO
from collections import defaultdict
output_file = open('B.bed','w')
with open('A.bed') as f:
    for line in f:
        name, start, stop = line.split()
        start =  int((name.split(':')[1].split('-')[0]))+line.index(start)
        stop = start + len(stop)            
        # print short_sequence_record.id, start, stop
    output_line ='%s\t%i\t%i\n' % \
        ((line.split(':')[0]),start,stop)
    output_file.write(output_line )
output_file.close()

A.кровать

chr1:27860291-27862300  785 789
chr1:27860291-27862300  1539 1543
chr1:15504072-15506081  675 679

Вывод

chr1 15504096 15504099

Ожидаемый результат

chr1 27861075 27861079
chr1 27861829 27861833
chr1 15504746 15504750

person Xiong89    schedule 06.07.2015    source источник


Ответы (4)


Из вашего ожидаемого результата может показаться, что вы просто добавляете последние 2 числа каждой строки к первому числу и вычитаете один.

import re  # regular expressions, not needed (alternatives: the `split` method) but convenient

re_pattern = r'[^:]*:(\d+)\D+(\d+)\D+(\d+)\D+(\d+)'
with open(inputfile) as fin:
    for line in fin:
        start, _, offset_start, offset_end = re.search(re_pattern, line).groups()
        print('chr1 {} {}'.format(int(start) + int(offset_start) - 1,int(start) + int(offset_end) - 1))

Есть несколько причин, по которым ваш код не дает желаемого результата, одна из которых заключается в том, что вы берете длину строки с кодом stop = start + len(stop). Сначала вам нужно явно указать тип int. Вы также должны помнить о своих отступах: прямо сейчас вы пишете только одну строку после завершения цикла for. Однако вы, похоже, хотите делать это при каждом прогоне этого цикла.

person Oliver W.    schedule 06.07.2015
comment
Спасибо. Это действительно полезно. - person Xiong89; 06.07.2015

Я думаю, вы можете разделить строку, чтобы создать список, как показано ниже, чтобы сделать это:

ch = '27860291-27862300  785 789'
ll = [int(i) for i in re.split(r'[ -]+',ch)]
print ll
[27860291, 27862300, 785, 789]
start = ll[0]+ll[2]-1
end = ll[0]+ll[3]-1
print start,end
27861075 27861079
person Joswin K J    schedule 06.07.2015

Это ошибка отступа из-за использования Python значительных пробелов. Поскольку выходная строка находится на неправильном уровне отступа, Python считает, что она должна выполняться вне цикла.

Вот обновленная программа:

from collections import defaultdict
output_file = open('B.bed','w')
with open('A.bed') as f:
    for line in f:
        name, start, stop = line.split()
        start =  int((name.split(':')[1].split('-')[0]))+line.index(start)
        stop = start + len(stop)            
        # print short_sequence_record.id, start, stop
        output_line ='%s\t%i\t%i\n' % \
        ((line.split(':')[0]),start,stop)
        output_file.write(output_line )
output_file.close()
person Matthew King    schedule 06.07.2015

Думаю, проблема в недостаточном отступе строки output_line ='%s\t%i\t%i\n' % ((line.split(':')[0]),start,stop) и последующей строки.

from Bio import SeqIO

output_file = open('B.bed','w')
with open('A.bed') as f:
    for line in f:
        name, start, stop = line.split()
        start =  int((name.split(':')[1].split('-')[0])) + line.index(start)
        stop = start + len(stop)            

        # print short_sequence_record.id, start, stop
        output_line ='%s\t%i\t%i\n' % ((line.split(':')[0]), start, stop)
        print output_line
        output_file.write(output_line)

output_file.close()

Кажется, генерирует правильный вывод, печатая

chr1    27860315    27860318

chr1    27860315    27860319

chr1    15504096    15504099

Эти данные попали в файл, что можно проверить ниже:

with open('B.bed') as f:
    for line in f:
        print line,

который дает

chr1    27860315    27860318
chr1    27860315    27860319
chr1    15504096    15504099
person Curt F.    schedule 06.07.2015