Как разбить файл fasta

Этот код предназначен для извлечения и разделения последовательностей из файла fasta

outfile=open('outf','w') for line in open('input'): if line[0]==">": outfile.write('\n') else: outfile.write(line.strip()) outfile.close() all_codons=[] for line in open('outf', 'r'): seq=line.strip() codons = [seq[i:i+3] for i in xrange(0, len(seq), 3) if len(seq[i:i+3])==3] all_codons.append(codons) 

Затем из разбитых последовательностей я хочу взять три последовательности, их длины – 9 (9 баз):

  CGTAACAAG AATCCGGAG CCGCCTCGG 

Я разделяю первую последовательность на 3 подпоследовательности из трех оснований, поэтому из одной последовательности я получаю 3 подпоследовательности, я делаю то же самое для двух других последовательностей.

Как это:

  CGT AAC AAG AAT CCG GAG CCG CCT CGG 

пример:

 identical_segment('CGT') 

Я хочу применить эту функцию к каждой подпоследовательности трех последовательностей, а затем применить одно и то же к файлу fasta. Итак, цель состоит в том, чтобы получить матрицу, например, я беру первую подпоследовательность «CGT» и применяю функцию same_segment (), она возвращает 28, то же самое для остальных 8 подпоследовательностей. Поэтому я получаю матрицу (3,3):

 28 2 3 4 23 35 23 4 27 

Что я могу сделать?

2 Solutions collect form web for “Как разбить файл fasta”

В вашем коде есть некоторые проблемы.

Во-первых, вам нужны только определенные строки в вашем файле, выкидывание других, а затем вывод нужных строк в файл. Я не уверен, зачем нужен последний шаг. Более эффективная прямая обработка линий.

 def processLines(inputname): all_codons=[] for line in open(inputname): if line[0]==">": seq=line.strip() codons = [seq[i:i+3] for i in xrange(0, len(seq), 3) if len(seq[i:i+3])==3] all_codons.append(codons) return all_codons 

Кроме того, каждый вызов ident_segment генерирует словарь, который вы используете для сопоставления с str на оценки. Это может стать дорогостоящим, когда количество звонков масштабируется. Чтобы этого избежать, вы можете попробовать два способа:

 code={"a":0,"c":1,"g":2,"t":3} def identical_segment(input_string): .... # what you have written 

или создать класс, экземпляр которого содержит словарь.

Чтобы обрабатывать несколько файлов, выполните следующие действия:

 output = [processLines(filename) for filename in filenames] # filenames is an iterable 

или если вы хотите отобразить имя ввода для вывода:

 outputDict = {filename: processLines(filename) for filename in filenames} 

В конце концов, вызовите функцию анализа на каждом выходе и напишите их в выходной файл.

Подводя итог тому, что вы должны забрать в этом посте:

  1. Выходные файлы могут быть не лучшим вариантом, так как файл IO стоит дорого. Если вы напишете его в какой-то файл, значит, вам нужно снова его прочитать, что вдвойне дорого.

  2. Тот же объект нельзя создавать снова и снова. Корректируйте свой код, чтобы убедиться, что этого не происходит.

  3. Разделите свою основную задачу на несколько небольших задач, а затем подумайте о простом и интуитивном способе для начала каждой задачи. В этом примере у нас есть processfiles-> analysis-> output_result

  4. Понимание – полезный способ итерации вещей в Python, и это более читаемо. Вы можете искать понимание и понимание словаря, чтобы узнать больше.

Попробуйте что-нибудь самостоятельно. Я буду более чем счастлив прочитать ваш улучшенный код здесь.

Попробуйте использовать BioPython для извлечения нуклеотидных последовательностей из вашего файла fasta. Используя этот пакет,

 from Bio import AlignIO for record in AlignIO.parse('filename.fasta', 'fasta'): print record.id, record.seq # or store in a new file seqs = [] for record in AlignIO.parse('filename.fasta', 'fasta'): seqs.append(record.seq + '\n') with open(outfile, 'w') as out: out.writelines(seqs) 
Python - лучший язык программирования в мире.