Как написать строковый алгоритм - PullRequest
0 голосов
/ 30 мая 2019

учитывая текстовый файл FASTA (Rosalind_gc.txt), я должен пройти через каждую запись ДНК и определить процент (%) содержания гуанин-цитозина (GC).

Пример этого:

Пример набора данных:

>Rosalind_6404
CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTTCCC
TCCCACTAATAATTCTGAGG    
>Rosalind_5959
CCATCGGTAGCGCATCCTTAGTCCAATTAAGTCCCTATCCAGGCGCTCCGCCGAAGGTCT
ATATCCATTTGTCAGCAGACACGC
>Rosalind_0808
CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGAC
TGGGAACCTGCGGGCAGTAGGTGGAAT

Пример вывода:

Rosalind_0808 60.919540

Таким образом, в основном, просматривайте каждую строку, подсчитывайте количество раз, когда G / C появляется, и затем делите это общее количество на длину каждой строки. Моя проблема заключается в том, чтобы узнать, как определить разрывы в коде (т. Е.> Rosalind_6404). Я хотел бы получить пример этого кода без использования Biopython, а также с подходом биопиона.

Ответы [ 3 ]

2 голосов
/ 31 мая 2019

Поскольку вы ищете решение Biopython, вот очень простое:

from Bio import SeqIO
from Bio.SeqUtils import GC

for r in SeqIO.parse('Rosalind_gc.fa', 'fasta'):
    print(r.id, GC(r.seq))

Выходы:

Rosalind_6404 53.75
Rosalind_5959 53.57142857142857
Rosalind_0808 60.91954022988506
2 голосов
/ 31 мая 2019

Вы можете читать файл построчно и накапливать данные последовательности до следующей строки, которая начинается с «>» (плюс еще один раз в конце файла)

def getCount(seq):
    return seq.count("G")+seq.count("C") 

with open("input.txt","r") as file:
    sequence = ""
    name     = ""
    for line in file:
        line = line.strip()
        if not line.startswith(">"):
            sequence += line
            continue
        if name != "":
            print(name, 100*getCount(sequence)/len(sequence))
        name     = line[1:]
        sequence = ""
    print(name, 100*getCount(sequence)/len(sequence))

# Rosalind_6404 53.75
# Rosalind_5959 53.57142857142857
# Rosalind_0808 60.91954022988506
1 голос
/ 31 мая 2019

Возможно, вы захотите максимально использовать предварительно скомпилированные модули C для снижения производительности. Существует одно решение с использованием регулярных выражений:

seq = 'CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTTCCCTCCCACTAATAATTCTGAGG'

import re
perc = re.subn(r'[GC]', '', seq) / len(seq)

А также обрабатывать строки ">":

seq = []
name = ''

for line in open('Rosalind_gc.txt'):
    if not line.startswith('>'):
        seq.append(line.strip())
    else:
        if seq:
            seq = ''.join(seq)
            perc = re.subn(r'[GC]', '', seq) / len(seq)
            print('{} has GC percent: {}'.format(name, perc * 100))
            seq = []
        name = line.strip()
...