#python #regex
#python #регулярное выражение
Вопрос:
Уважаемые биоинформатики!
Я пытаюсь создать скрипт на Python, который позволит мне взять файл, содержащий последовательности в формате, отличном от формата FASTA, и затем преобразовать их в формат FASTA, а затем записать их все в один файл, содержащий все последовательности.
Например: Две неформатированные последовательности в формате FASTA…
неформатированный 1
1 tcacatctct acgtactgaa tttaaaggct ttttgtcttt ttctcgtttc tttgcttttc
61 aatgatgttc aagcgtaacc tcggaaaatg tgtacaaact tgagtacaaa tcgccatatt
и
неформатированный 2
1 tcaggagaat gcagatgaca gcagtagcgc accaagtaac cccttttcta acgtcttacg
61 aagttatggc tcgttaccac attagctata cgacgctctg gcgaagaata aaagatggca
и хотите преобразовать их в это:
>seq1
TCACATCTCTACGTACTGAATTTAAAGGCTTTTTGTCTTTTTCTCGTTTCTTTGCTTTTC
AATGATGTTCAAGCGTAACCTCGGAAAATGTGTACAAACTTGAGTACAAATCGCCATATT
TACCGTTTTTAGCCAAATTCCATGACACAAACCTAGCTGTAGGCCTTGTTCCTACTGGGT
TTTAGCCAAAACTTGCCTATATTTTTTATGCCAAAAATCGAGAAATGATGGTAAGACGTT
CGCGATTATCTCTAATTGTTTGCCGGTTGAGTTGGTTACCGGTTGCTTTCTTGCTGTCC
>seq2
TCAGGAGAATGCAGATGACAGCAGTAGCGCACCAAGTAACCCCTTTTCTAACGTCTTACG
AAGTTATGGCTCGTTACCACATTAGCTATACGACGCTCTGGCGAAGAATAAAAGATGGCA
GCTTGCCGCAACCTCGTATCAACCGAAATACACGAAACAAGCTGTGGCACATTGAAGACT
TGGAGGAGTATGAGAAGAATTAGGAATAGATAGCGTAGCTTAGTTTTTCTGTTGGAGCTT
GGACTAACGCTTTGAAACGCCGGCTTGTGCCAACAATATAGTTAATATGTACACCAACTT
AGGCTAAGATAGCAGCATGGATTTTTTATTGATTGGATGGATAGGTAAGTGACGACTCCT
CAAGAACGGACAACAGGTATTACAAATGCGTCGATAAAAA
Пока у меня есть это:
def cleanandFormat(filename, seqName, seq):
"""
writes out the sequence of an irregular sequence format to a file, while cleaning and formatting it into the standard form
inputs:
filename - string of a filename
seqName - string of sequence description
seq - string of the sequence
output: clean and standard-formatted data to a file.
"""
#sets the blocklength for the max number of characters in a line
blockLength = 60
with open(filename, 'w') as fh:
#write out the header and sequence name
fh.write('>' seqName 'n')
for i in range(0, len(seq), blockLength):
fh.write(seq[i:i blockLength].upper() 'n')
#defines the pattern as any digit and any whitespace
pattern = 'd|s'
#this will replace the pattern found in the sequence with an empty string
replace = ''
seq = ''
filename = 'seqCleanup2.txt'
with open(filename) as fh:
for line in fh:
seq = re.sub(pattern, replace, line)
cleanandFormat('testfasta.txt', 'seqX', seq)
Комментарии:
1. забыл упомянуть, что я хочу придерживаться регулярных выражений и что моя главная проблема заключается в том, чтобы выяснить, как распознать новую последовательность. Я подумал, что мог бы использовать REs, чтобы найти, где находится число 1, и перейти оттуда.
2. Итак, в чем здесь вопрос? Ваш метод близок к работе. Мы не полностью знаем формат файлов, которые помогут. Есть ли, например, одна последовательность fasta в одной строке? Кстати, я бы рекомендовал не использовать = в вашей строке
seq
. Создайте seq в виде списка и добавьте к нему каждую последовательность. Затем используйте что-то вроде'n'.join(seq)
, когда вы все добавите. Строки неизменяемы в Python. Это означает, что каждый раз, когда вы используетеseq =
, создается новая строка. С подобным скриптом это может действительно замедлиться, если вы работаете с большими файлами.3. мой вопрос в том, как мне написать код, чтобы python ЗНАЛ, когда начинается новая последовательность. Файл FASTA обычно всегда будет выглядеть как: 1 XXXXXX XXXXX (как указано выше). Новая последовательность начинается, когда перед последовательностью находится число «1»
4. Я полагаю, что я просто зацикливаю и записываю каждую последовательность ДНК в файл, если и когда текст начинается с 1
5. @Eugene: Тогда просто проверяйте при просмотре каждой строки, являются ли первые два символа
"1 "
. Если это так, то выполните для этого свое регулярное выражение. Мне кажется, что это должно сработать.
Ответ №1:
Я не знаю python, но вот он в Ruby (не тестировался), просто скачайте ruby, сохраните это в файле и запустите его:
count = 0
while line = gets
if(line =~ /^1s[a-zs] $/)
count = 1
puts
puts ">seq#{count}"
end
if(line =~ /^d s([a-zs] )$/)
puts $1.gsub(/s/, "").upcase
end
end