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 ответ:
Если я правильно понял вопрос, то проблема, с которой вы столкнулись, связана только с номером хромосомы (
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))