Нарезка файла fasta

Помоги мне,

У меня есть файл fasta, я хочу применить к нему некоторые операции. Я полагаю, что мой файл содержит 500 последовательностей, и for i=1 to 500 я хочу взять три последовательности и применить некоторые функции, поэтому я буду выполнять одни и те же операции 166 раз, каждый раз, когда я взять 3 последовательности

for i=1 to 500 do (500 number of sequences in fasta file)

take 3 sequences

    apply some functions

Пример. Мой файл содержит 9 последовательностей.

   1-tatctattaccc

   2-gctgcgataagc

   3-tcctacttttgt

   4-caggaaaagaaa

   5-actgaatccctt

   6-ctgaagttgact

   7-aggtttgaagtg

   8-aacttccaactc

   9-gaaaagcaccct

Я беру первые 3 последовательности

       seq1-tatctattaccc

       seq2-gctgcgataagc

       seq3-tcctacttttgt  

Я применяю некоторые функции, затем беру последовательности 4, 5, 6, делаю то же самое, что и последовательности 1, 2, 3, затем делаю то же самое с 7, 8, 9 Это моя функция :

def identical(input_string):
code={"a":0,"c":1,"g":2,"t":3}
p=[code[i] for i in input_string]
n=len(input_string)
c=0
for i, n in enumerate(range(n, 0, -1)):
    c +=p[i]*(4**(n-1))
    return c+1

Моя функция должна использовать только это: {"a", "c", "g", "t"}, но в фасте последовательность файлов начинается с '>', например:

>gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S rRNA gene and ITS1 and ITS2 DNA
CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGGAATAAACGATCGAGTG
AATCCGGAGGACCGGTGTACTCAGCTCACCGGGGGCATTGCTCCCGTGGTGACCCTGATTTGTTGTTGGG
CCGCCTCGGGAGCGTCCATGGCGGGTTTGAACCTCTAGCCCGGCGCAGTTTGGGCGCCAAGCCATATGAA
AGCATCACCGGCGAATGGCATTGTCTTCCCCAAAACCCGGAGCGGCGGCGTGCTGTCGCGTGCCCAATGA
ATTTTGATGACTCTCGCAAACGGGAATCTTGGCTCTTTGCATCGGATGGAAGGACGCAGCGAAATGCGAT
AAGTGGTGTGAATTGCAAGATCCCGTGAACCATCGAGTCTTTTGAACGCAAGTTGCGCCCGAGGCCATCA
GGCTAAGGGCACGCCTGCTTGGGCGTCGCGCTTCGTCTCTCTCCTGCCAATGCTTGCCCGGCATACAGCC
AGGCCGGCGTGGTGCGGATGTGAAAGATTGGCCCCTTGTGCCTAGGTGCGGCGGGTCCAAGAGCTGGTGT
TTTGATGGCCCGGAACCCGGCAAGAGGTGGACGGATGCTGGCAGCAGCTGCCGTGCGAATCCCCCATGTT
GTCGTGCTTGTCGGACAGGCAGGAGAACCCTTCCGAACCCCAATGGAGGGCGGTTGACCGCCATTCGGAT
GTGACCCCAGGTCAGGCGGGGGCACCCGCTGAGTTTACGC

>gi|2765657|emb|Z78532.1|CCZ78532 C.californicum 5.8S rRNA gene and ITS1 and ITS2 DNA
CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGACAACAGAATATATGATCGAGTG
AATCTGGAGGACCTGTGGTAACTCAGCTCGTCGTGGCACTGCTTTTGTCGTGACCCTGCTTTGTTGTTGG
GCCTCCTCAAGAGCTTTCATGGCAGGTTTGAACTTTAGTACGGTGCAGTTTGCGCCAAGTCATATAAAGC
ATCACTGATGAATGACATTATTGTCAGAAAAAATCAGAGGGGCAGTATGCTACTGAGCATGCCAGTGAAT
TTTTATGACTCTCGCAACGGATATCTTGGCTCTAACATCGATGAAGAACGCAGCTAAATGCGATAAGTGG
TGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCTCGAGGCCATCAGGCTAAG
GGCACGCCTGCCTGGGCGTCGTGTGTTGCGTCTCTCCTACCAATGCTTGCTTGGCATATCGCTAAGCTGG
CATTATACGGATGTGAATGATTGGCCCCTTGTGCCTAGGTGCGGTGGGTCTAAGGATTGTTGCTTTGATG
GGTAGGAATGTGGCACGAGGTGGAGAATGCTAACAGTCATAAGGCTGCTATTTGAATCCCCCATGTTGTT
GTATTTTTTCGAACCTACACAAGAACCTAATTGAACCCCAATGGAGCTAAAATAACCATTGGGCAGTTGA
TTTCCATTCAGATGCGACCCCAGGTCAGGCGGGGCCACCCGCTGAGTTGAGGC

So,

if line=='>' then  pass

то есть: такие строки, как: >gi|2765657|emb|Z78532.1|CCZ78532 C.californicum 5.8S rRNA gene and ITS1 and ITS2 DNA, должны быть проигнорированы. Когда я использую свою функцию, она дает эту ошибку:

KeyError: '>'  

или ошибка вида: KeyError: 'CGT'

Как мне это сделать?


person m28    schedule 27.07.2013    source источник
comment
Если вы хотите ответить на чей-то ответ, вы должны опубликовать комментарий, а не редактировать его сообщение.   -  person inspectorG4dget    schedule 28.07.2013
comment
На какую часть линии нужно обратить внимание, это A/T/C/G?   -  person inspectorG4dget    schedule 28.07.2013
comment
хорошо, это последовательность:>gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S rRNA gene and ITS1 and ITS2 DNA **CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGGAATAAACGATCGAGTGAATCCGGAGGACCGGTGTACTCAGCTCACCGGGGGCATTGCTCCCGTGGTGACCCTGATTTGTTGTTG**, для меня я хочу обратить внимание на все базы между звездами   -  person m28    schedule 28.07.2013
comment
Как я уже упоминал в ответ на ваш комментарий к моему ответу, в поле для комментариев явно отсутствует форматирование. Отредактируйте свое сообщение, включив в него одну полную репрезентативную строку из файла fasta и указав, какую ее часть вы хотите извлечь.   -  person inspectorG4dget    schedule 28.07.2013


Ответы (4)


На питоне 2.x:

import itertools
with open('path/to/file') as infile:
    for seq1, seq2, seq3 in itertools.izip(infile, infile, infile):
        do_something(seq1, seq2, seq3)

Причина, по которой я использую itertools.izip вместо обычного zip, заключается в том, что в python 2.x zip возвращает список, который вы затем перебираете. itertools.izip, с другой стороны, перебирает соответствующие элементы, не создавая список в первую очередь. Это экономит использование памяти, а также время, необходимое для выделения памяти и создания списка.

В python 3.x встроенный zip работает точно так же, как itertools.izip в python 2.x (чтобы получить функциональность zip python 2.x в python 3.x, вам нужно сделать L = list(zip(…))):

with open('path/to/file') as infile:
    for seq1, seq2, seq3 in zip(infile, infile, infile):
        do_something(seq1, seq2, seq3)

Надеюсь это поможет

person inspectorG4dget    schedule 27.07.2013
comment
с open('path/to/file') as infile: для seq1, seq2, seq3 в zip(infile, infile, infile): do_something(seq1, seq2, seq3), здесь я должен использовать функцию, которая возвращает целое число, но мои последовательности начинаются с ›' - person m28; 28.07.2013
comment
да, это моя функция:def a(input_string): code={"a":0,"c":1,"g":2,"t":3} p=[code[i] for i in input_string] n=len(input_string) c=0 for i, n in enumerate(range(n, 0, -1)): c +=p[i]*(4**(n-1)) return c+1, - person m28; 28.07.2013
comment
@ m28: вам нужно отредактировать эту функцию в исходном сообщении вместе с ошибкой. Комментарий сам по себе недостаточно конкретен - person inspectorG4dget; 28.07.2013

Вы можете сделать что-то вроде этого:

import itertools

with open('/tmp/lines.txt', 'rU') as fasta:
    data=itertools.izip_longest(*[fasta]*3)

Преимущество этого заключается в доставке всех строк, даже если количество строк не может быть кратным 3. Остаток последнего кортежа (0, 1 или 2 последнего кортежа) заполняется None. Вы хотели бы, чтобы something() предвидел это.

Или, если вы хотите расшириться до трех переменных:

with open('/tmp/lines.txt', 'rU') as fasta:
    for a,b,c in itertools.izip_longest(*[fasta]*3):
        something(a,b,c)

Обратите внимание, что, поскольку izip_longest завершает кортежи, если количество строк в файле не является целым числом, кратным 3 с None, вы можете иметь c или b, c как None. Просто проверьте это или выбросьте последний кортеж, если он неполный.

Если вы знаете, что не будете использовать последний кортеж, если он неполный, используйте это:

with open('/tmp/lines.txt', 'rU') as fasta:
    for a,b,c in itertools.izip(*[fasta]*3):
        something(a,b,c)
person dawg    schedule 27.07.2013
comment
Честная оценка. Наверное, я смотрел на предварительно отредактированную версию вашего поста. отозван - person inspectorG4dget; 28.07.2013

Я думаю, что лучший способ работы с последовательностями fasta в python — всегда использовать Biopython. Сначала может быть немного сложно, но это того стоит.

Прежде всего, вы должны установить biopython. Просто введите в свой терминал:

sudo apt-get install python-biopython

Теперь у вас есть невероятный парсер fasta на python!

>>> from Bio import SeqIO

Таким образом, теперь вы можете перебирать записи (последовательности) и независимо извлекать их идентификатор, описание, последовательность, алфавит, получать обратное дополнение и т. д.

with open("your_fasta_file.fasta", "r") as infh:
    parser = SeqIO.parse(infh, "fasta")

Теперь у вас есть «парсер» вашего файла fasta, который представляет собой итератор, который вы можете использовать в цикле:

for sequence in parser:
    do stuff with sequence.id 
    do stuff with str(sequence.seq) # See below why str(seq)
    do stuff with sequence.description

Для записи вида «>gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S ген рРНК и ITS1 и ITS2»

sequence.id --> будет что-то вроде "gi|2765658|emb|Z78533.1|"

sequence.description --> будет полным заголовком ">gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S рРНК гена и ITS1 и ITS2"

sequence.seq --> будет последовательностью. Вы должны быть осторожны в этот момент, потому что sequence.seq возвращает объект Seq: Seq('AGCTAGTAGCTG... ATGAC', Alphabet())

Если вы хотите использовать последовательность как обычную строку, просто используйте:

str(Seq_object)
person Galo GS    schedule 17.03.2015

person    schedule
comment
спасибо, между моей операцией есть функция которая возвращает целое число, в моем файле есть такие строки:›gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S рРНК ген и ITS1 и ITS2, которые указывают последовательность, для меня * я должен игнорировать эту часть, потому что она выдает ошибку с '›' и '|', когда я использую функцию - person m28; 28.07.2013