Python: как вывести правильное имя хромосомы в выводе?


Я столкнулся с этой ошибкой при попытке изменить код, в котором имя хромосомы не следует за именем хромосомы моего входного файла. В основном приведенный ниже код должен считывать входной файл и уведомлять о местоположении более короткой последовательности и выводить последовательность расположения на основе информации, приведенной в файле. Например, в chr4: 154742507-154742714 значение 151 указывает местоположение первых баз, а местоположение CCCAGGCTGG равно 173 - 182. Поэтому с помощью приведенного ниже кода следует уметь верните мне точное местоположение, добавив 173 к 154742507 и получите результат ниже. Кто-нибудь может мне помочь?

Ниже приведен код с примером входного текстового файла.

Вход.txt

chr4:154742507-154742714


                           CCCAGGCTGG
151  AGTCTTGCTTTTTTTGTCGTTGCCCAGGCTGGAGTGCAGTGGCACCATCTCGGCTCAC


chr9:47303792-47303999

      CCAGCCTGGG
1    TCCAGCCTGGGTGACAGCGTGAGGCTCTTGTCTCAAATAGAAAAAAAACAAAGAACAAAAAACAAAAAACCACCA

Вывод

chr1    154742680   154742690
chr1    47303794    47303804

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

chr4    154742680   154742690
chr9    47303794    47303804

Код

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

result = []
output_file=open('output.bed','w')
with open('Input.txt') as f:
    for line in f:
        if line.startswith('chr'):
            label = line.strip()
        elif line[0] == ' ':
            # short sequence
            length = len(line.strip())
            # find the index of the beginning of the short sequence
            for i, c in enumerate(line):
                if c.isalpha():
                    short_index = i
                    break
        elif line[0].isdigit():
            # long sequence
            n = line.split(' ')[0]
            # find the index of the beginning of the long sequence
            for i, c in enumerate(line):
                if c.isalpha():
                    long_index = i
                    break
            start = int(n) + short_index - long_index
            start -= 1
            end = start + length
            result.append('{} {} {}'.format(label, start, end))
            offset, n, start, length = 0, 0, 0, 0
output_line= "n".join(result)
output_file.write(output_line)
output_file.close()

output_file=open('last_output.bed','w')
with open('output.bed') as fin:
    for line in fin:
        start, _, offset_start, offset_end = re.search(r'[^:]*:(d+)D+(d+)D+(d+)D+(d+)', line).groups()
        output_line=('chr1t{}t{}n'.format(int(start) + int(offset_start) + 1,int(start) + int(offset_end) + 1))
        output_file.write(output_line)
output_file.close()
1 2

1 ответ:

Если я правильно понял вопрос, то проблема, с которой вы столкнулись, связана только с номером хромосомы (chr##), который выводится неправильно.

Это кажется немного очевидным. В конце вашего кода Вы жестко кодируете его:

output_line=('chr1\t{}\t{}\n'.format(stuff))

Если вы не хотите, чтобы выходные данные всегда показывали chr1, вам нужно будет изменить это.

Регулярное выражение в предыдущей строке, похоже, соответствует номеру хромосомы из файла, вы просто не записываете его в группу, которую можно использовать позже. Попробуйте:
chromosome, start, _, offset_start, offset_end = re.search(r'([^:]*):(\d+)\D+(\d+)\D+(\d+)\D+(\d+)', line).groups()
output_line=('{}\t{}\t{}\n'.format(chromosome, int(start) + int(offset_start) + 1,int(start) + int(offset_end) + 1))
Это все еще довольно уродливо, но должно сработать. Обратите внимание, что было бы намного проще, если бы вы сделали правильный вывод из вашего начального цикла, а не выписывали промежуточный формат, а затем его нужно было бы повторно обработать.