Использование условий для сопоставления нескольких шаблонов в строке - PullRequest
4 голосов
/ 28 марта 2019

У меня есть такой файл fasta: myfasta.fasta

>1_CDS
AAAAATTTCTGGGCCCCGGGGG
AAATTATTA
>2_CDS
TTAAAAATTTCTGGGCCCCGGGAAAAAA
>3_CDS
TTTGGGAATTAAACCCT
>4_CDS
TTTGGGAATTAAACCCT
>5_rRNA
TTAAAAATTTCTGGGCCCCGGGAAAAAA
>6_tRNA
TTAAAAATTTCTGGGCCCCGGGAAAAAA

У меня есть код, который я хочу использовать для разделения последовательностей на основе их идентификаторов, которые имеют соответствующие шаблоны, такие как 'CDS', 'tRNAи т. д. В приведенном ниже коде я пытаюсь использовать начальную строку, а также сопоставлять шаблон в строке, который, похоже, не работает.Может кто-нибудь, пожалуйста, помогите мне, как искать два условия в строке в Python.

код: python mycode.py myfasta.fasta

#!/usr/bin/env python
import sys
import os
myfasta = sys.argv[1]
fasta = open(myfasta)

for line in fasta:
    if line.startswith('>') and 'CDS' in line:
        print(line)
    else:
        print(line)

Ожидаемый вывод (если я использую CDS):

>1_CDS
AAAAATTTCTGGGCCCCGGGGG
AAATTATTA
>2_CDS
TTAAAAATTTCTGGGCCCCGGGAAAAAA
>3_CDS
TTTGGGAATTAAACCCT
>4_CDS
TTTGGGAATTAAACCCT

Ответы [ 3 ]

4 голосов
/ 28 марта 2019

Вот код, который работает для вас.Если строка имеет CDS, она печатает строку и следующие строки.strip() удаляет символ конца строки при печати строки.

#!/usr/bin/env python
import sys
import os
myfasta = sys.argv[1]

flag = False
with open(myfasta) as fasta:
    for line in fasta:
        if line.startswith('>') and 'CDS' in line:
            flag = True
        elif line.startswith('>'):
            flag = False
        if flag:
            print(line.strip())

Редактировать : Вы можете удалить часть elif как следующий код:

#!/usr/bin/env python
import sys
import os
myfasta = sys.argv[1]

flag = False
with open(myfasta) as fasta:
    for line in fasta:
        if line.startswith('>'):
            flag = 'CDS' in line
        if flag:
            print(line.strip())
1 голос
/ 28 марта 2019

Ответ Maanijou в порядке.

Кроме того, рассмотрите альтернативу с итератором.

РЕДАКТИРОВАТЬ: Обновлен код на основе ваших комментариев

#!/usr/bin/env python
import sys
import os
myfasta = sys.argv[1]
fasta = open(myfasta, "r+")

file_contents = iter(fasta)

try:
    print_flag = True
    while True:
        line = file_contents.next()
        if line.startswith('>'):
            if "CDS" in line:
                print (line.strip())
                print_flag = True
            else:
                print_flag = False
        else:
            if print_flag:
                print (line.strip())

except StopIteration:
    print ("Done")
    fasta.close()

Объяснение

file_contents = iter(fasta) преобразует итерируемый файловый объект в итератор, для которого вы можете просто продолжать вызывать next() до тех пор, пока не закончится чтение

Почему я не рекомендую вызывать readlines какнекоторые другие ответы таковы: иногда файлы fasta могут быть большими, и вызов readlines потребляет значительную память.

, если строка удовлетворяет вашему запросу, вы просто печатаете ее и следующую строку, если нет, то просто читаете следующуюи ничего не делать,

Объяснение для обновления

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

Я проверил его с помощью измененного файла FASTA, например,

>1_CDS
AAAAATTTCTGGGCCCCGGGGG
AAAAATTTCTGGGCCCCGGGGG
AAAAATTTCTGGGCCCCGGGGG
AAAAATTTCTGGGCCCCGGGCG
>2_CDS
TTAAAAATTTCTGGGCCCCGGGAAAAAA
>3_CDS
TTTGGGAATTAAACCCT
>4_CDS
TTTGGGAATTAAACCCT
>5_rRNA
TTAAAAATTTCTGGGCCCCGGGAAAAAA
>6_tRNA
TTAAAAATTTCTGGGCCCCGGGAAAAAA

И этот вывод

python fasta.py fasta.fasta
>1_CDS
AAAAATTTCTGGGCCCCGGGGG
AAAAATTTCTGGGCCCCGGGGG
AAAAATTTCTGGGCCCCGGGGG
AAAAATTTCTGGGCCCCGGGCG
>2_CDS
TTAAAAATTTCTGGGCCCCGGGAAAAAA
>3_CDS
TTTGGGAATTAAACCCT
>4_CDS
TTTGGGAATTAAACCCT
Done
0 голосов
/ 28 марта 2019

Это то, что вы хотите?

#!/usr/bin/env python
import sys
import os
from collections import defaultdict

myfasta = sys.argv[1]
with open(myfasta) as fasta:
    data = fasta.read().splitlines()

pattern_data = defaultdict(list)
index = 0
while index < len(data):
    if data[index].startswith('>'):
        start = data[index].index('_') + 1
        key = data[index][start:]
        pattern_data[key].append(data[index + 1])
    index += 2

На этом этапе вы можете делать все что угодно с отсортированными данными.

Вышеприведенное предполагает, что весь файл, который вы анализируете, соответствует точному формату, показанному выше: 1 строка, начинающаяся с ">", это идентификатор единственной строки, которая следует. Если у вас есть несколько строк, которые следуют, код нуждается в незначительной модификации.

EDIT: Я только что прочитал о файлах фаста. Теперь я знаю, что на самом деле они могут иметь последовательности, длина которых превышает одну строку после их идентификации. Поэтому приведенный выше код необходимо модифицировать для учета многострочных последовательностей. Более обобщенный подход заключается в следующем:

#!/usr/bin/env python
import sys
import os
from collections import defaultdict

myfasta = sys.argv[1]
with open(myfasta) as fasta:
    data = fasta.read().splitlines()

id_line_indices = [index for index, line in enumerate(data) if line.startswith('>')]
id_line_indices.append(len(data))
pattern_buckets = defaultdict(list)

i = 0
while i < len(id_line_indices) - 1:
    start = data[id_line_indices[i]].index('_') + 1
    key = data[id_line_indices[i]][start:]

    sequence = [data[index] for index in range(id_line_indices[i] + 1, id_line_indices[i + 1])]
    sequence = ''.join(sequence)

    pattern_buckets[key].append(sequence)
    i += 1

Это все еще дает те же результаты для вышеуказанного набора данных. Например,

print(pattern_buckets['CDS'])
print(pattern_buckets['rRNA'])

Получит вас:

['AAAAATTTCTGGGCCCCGGGGG', 'TTAAAAATTTCTGGGCCCCGGGAAAAAA', 'TTTGGGAATTAAACCCT', 'TTTGGGAATTAAACCCT']
['TTAAAAATTTCTGGGCCCCGGGAAAAAA']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...