2015-09-19 1 views
2

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

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

input.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=('chr1\t{}\t{}\n'.format(int(start) + int(offset_start) + 1,int(start) + int(offset_end) + 1)) 
     output_file.write(output_line) 
output_file.close() 

ответ

4

Если я правильно понял вопрос правильно, то вопрос у Вас есть только имеет дело с числом хромосом (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)) 

Это все еще довольно уродливое, но должно работать. Обратите внимание, что было бы намного проще, если бы вы сделали правильный вывод из вашего начального цикла, вместо того, чтобы писать промежуточный формат, а затем нужно его повторно обработать.

+0

Спасибо. Решено сейчас =) – Xiong89

Смежные вопросы