Возникли проблемы при создании текстового файла из заголовков Fast - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть несколько файлов fasta в каталоге. Мне нужно создать текстовый файл с определенным форматированием для каждого отдельного файла fasta. Полученный текстовый файл будет использоваться в качестве входного файла для другой программы ниже по потоку. Я новичок в Python, и я уверен, что мой сценарий ниже примерно так же неуклюже, как они приходят. Я уверен, что есть лучший способ выполнить эту задачу в biopython.

import os
import re

for FILE in os.listdir():
    if FILE.endswith(".fasta"):
        OUTPUT = open(FILE+".lft",'w')
        with open(FILE, 'r') as FIN:
            for LINE in FIN:
                if LINE.startswith('>'):
                    HEADER = re.sub('>','',LINE)
                    HEADER2 = re.sub('\n','',HEADER)
                    PART1_HEADER = HEADER2.split(":")
                    CONTIG = str(PART1_HEADER[0])
                    PART2_HEADER = PART1_HEADER[1]
                    SPLIT_PART2 = PART2_HEADER.split("-")
                    START = int(SPLIT_PART2[0])
                    END = int(SPLIT_PART2[1])
                    LENGTH = END-START
                    OUTPUT.write(str(START) + '\t' + str(HEADER2) + '\t' + str(LENGTH) + '\t' + str(CONTIG) + '\t' + str(END) + '\n')

Вот пример заголовков в каждом из файлов fasta:

>Spp-0:0-500
>Spp-1:0-3538
>Spp-2:0-1421
>Spp-3:0-500

Где:

"Spp" = название вида

"- 0" = идентификатор последовательности в фасте

": 0-500" = начальная и конечная позиции последовательности (невсе начинаются с нуля).

Я хочу сгенерировать текстовый файл, который выглядит следующим образом:

0       aVan-0:0-500    500     aVan-0  500
0       aVan-1:0-3538   3538    aVan-1  3538
0       aVan-2:0-1421   1421    aVan-2  1421
0       aVan-3:0-500    500     aVan-3  500
1st column: start position
2nd column: original header
3rd column: end position
4th column: everything before the ":"
5th column: the length between start & stop positions

Мой код работает довольно хорошо, но если у меня 25 быстрыхпоследовательности в каталоге, мой код будет обрабатывать только первые 24. Он также выводит на экран кучу чисел (обычно это 41 или 44 ... не знаю почему?), и я тоже хочу избавиться от этого.

1 Ответ

1 голос
/ 06 ноября 2019

только с использованием awk

 awk -F ':' '/^>/ {split($2,a,/\-/);printf("%s\t%s\t%s\t%s\t%s\n",a[1],substr($0,2),a[2],substr($1,2),int(a[2])-int(a[1]));}' in.fasta

0   Spp-0:0-500 500 Spp-0   500
0   Spp-1:0-3538    3538    Spp-1   3538
0   Spp-2:0-1421    1421    Spp-2   1421
0   Spp-3:0-500 500 Spp-3   500
...