#biopython
#питон #последовательность #биопитон #фаста
Вопрос:
Я пытаюсь создать функцию в python, которая считывает как однозначные, так и неоднозначные нуклеотидные последовательности из файла fasta и возвращает идентификатор последовательности и молекулярный вес.
Я попробовал это сделать со следующим кодом:
import Bio from Bio import SeqUtils, SeqIO def function(filename): nucleotides ={'A','T', 'C', 'G'} with open(filename) as file: for record in SeqIO.parse(file, "fasta"): for nucl in record: if nucl in nucleotides: continue else: print(str(record.id) ": is ambiguous") break else: mol_weight= Bio.SeqUtils.molecular_weight(record) print(str(record.id) ": is unambiguous amp; molecular weight = " str(mol_weight)) function("random.fasta")
Если я использую этот код для неоднозначных последовательностей, то абсолютно никаких проблем не возникнет, и я получу результат, который имел в виду. Если я менее однозначной последовательности, я получаю «ValueError: ‘я’ не является допустимым однозначные буквы ДНК» обусловлено биологически.SeqUtils.функция molecular_weight(запись), по которым в моем понимании не имеет смысла, так как буква «I», как правило, причиной разрыва первого блока else, если я получил это неправильно.
Я также использовал пользовательскую функцию для ручного вычисления молекулярного веса (на основе фиксированных значений), и в этом случае ошибок нет, и функция отлично работает как для неоднозначных, так и для однозначных последовательностей. Однако кто-то указал, что мой ручной расчет не так точен, как встроенная функция.
Я немного новичок в Python, но я надеюсь, что кто-нибудь может знать, почему ошибка ValueError все еще возникает и как ее решить.
Комментарии:
1. Я исправил отступ в теле функции — легко ошибиться при вставке кода в форму. Я также включил необходимый импорт для запуска кода — все, что нужно, — это действительный файл fasta.
Ответ №1:
Я думаю, что ошибка происходит в выражении mol_weight= Bio.SeqUtils.molecular_weight(record)
.
Запись неявно преобразуется в ее строковое представление ID: SEQUENCE_1 ...
. Таким 'I'
образом, ошибка в значении соответствует вовсе не нуклеотиду, а довольно случайному строковому значению.
Попробуйте вместо этого эту строку: mol_weight = Bio.SeqUtils.molecular_weight(record.seq)
Для меня это вернуло желаемый результат:
SEQUENCE_1: is unambiguous amp; molecular weight = 331.2218
для тривиальной последовательности (просто буква А), которая раньше вызывала бы описанную вами ошибку.
gt;SEQUENCE_1 A
Обновить:
Полные решения выглядят следующим образом:
from Bio import SeqIO, SeqUtils def function(filename): with open(filename) as file: for record in SeqIO.parse(file, "fasta"): try: mol_weight = SeqUtils.molecular_weight(record.seq) print(f"{record.id}: is unambiguous amp; molecular weight = {mol_weight}") except ValueError as exception: print(f"{record.id}: {exception}") if __name__ == '__main__': function("random.fasta")
Я включил обработку выполнения из ответа @pippo1980, поскольку она действительно немного проще, быстрее и, возможно, более питоническая.
Комментарии:
1. Большое вам спасибо! В конце концов, это была довольно глупая ошибка с моей стороны.
2. Не совсем. Подобные ошибки легко совершать с Python из-за системы набора текста уткой. Мне пришлось запустить отладчик, чтобы обнаружить это. Пожалуйста, также отметьте ответ как «принятый ответ», если он решил вашу проблему.
Ответ №2:
короче:
from Bio import SeqIO, SeqUtils def function(filename): with open(filename) as file: for record in SeqIO.parse(file, "fasta"): try: mol_weight= SeqUtils.molecular_weight(record.seq, 'DNA') print(str(record.id) ": is unambiguous amp; molecular weight = " str(mol_weight)) except Exception as exception: print(record.id ':',str(type(exception).__name__), str(exception)) function("random.fasta") function("random.fasta")
введите случайный файл.fasta:
gt;first AAAAAAAAAAAAATTTTTTTTTTTTTTGGGGGGGGGGGGGGCCCCCCCCCCCCCCGTA gt;second AAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTICCCCCCCCCCCCCCCCCCCCCCCCCCC gt;third AAAAAAAAAQQQQQQQQQQQQQQQQQQTTTTTTTTTT gt;fourth AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTGGGGGGGGGGGGGGGGGCGCGCGCGCGC
выход:
first: is unambiguous amp; molecular weight = 17952.438 second: ValueError 'I' is not a valid unambiguous letter for DNA third: ValueError 'Q' is not a valid unambiguous letter for DNA fourth: is unambiguous amp; molecular weight = 25755.56080000001