Мне нужно улучшить функцию, которая анализирует мультифаст-файл, проверяя сжатие с помощью обработки try execpt. - PullRequest
0 голосов
/ 27 января 2020

Привет, ребята. Я работаю с огромным сжатым gz-файлом fasta, и у меня есть хороший анализатор фаста, но я хотел бы сделать его более общим, так как я могу проверить сжатие, чтобы разобрать gz или несжатый файл.

Я пытаюсь этот код:

def is_header(line):
    return line[0] == '>'

def parse_multi_fasta_file_compressed_or_not(filename):
    if filename.endswith('.gz'):
        with gzip.open(filename, 'rt') as f:
            fasta_iter = (it[1] for it in itertools.groupby(f, is_header))
    else:
        with open(filename, 'r') as f:
            fasta_iter = (it[1] for it in itertools.groupby(f, is_header))
            for name in fasta_iter:
                name = name.__next__()[1:].strip()
                sequences = ''.join(seq.strip() for seq in fasta_iter.__next__())
                yield name, sequences

ref: https://drj11.wordpress.com/2010/02/22/python-getting-fasta-with-itertools-groupby/
https://www.biostars.org/p/710/

Я пытался изменить отступы. Python не жалуется ни на какую ошибку. Тем не менее, он не печатает и не показывает никаких результатов. Я использую игрушечный файл с 5 последовательностями.

Просто напомню, что файл фаста выглядит примерно так:

>header_1
AATATATTCAATATGGAGAGAATAAAAGAACTAAGAGATCTAATGTCACAGTCTCGCACTCGCGAGATAC
TCACCAAAACCACTGTGGACCACATGGCCATAATCAAAAAGTACACATCAGGAAGGCAAGAGAAGAACCC
TGCACTCAGGATGAAGTGGATGATG
>header_2
AACCATTTGAATGGATGTCAATCCGACTTTACTTTTCTTGAAAGTTCCAGCGCAAAATGCCATAAGCACC
ACATTTCCCTATACTGGAGACCCTCC

Я бы хотел использовать try:... except:... вместо if .
Если у кого-нибудь из вас есть какой-нибудь совет, который поможет мне в этом разобраться, я был бы очень признателен (это вовсе не упражнение на курсе!).

Спасибо за ваше время.

Paulo

1 Ответ

1 голос
/ 27 января 2020

Похоже, вы слишком сильно отступили в `для l oop. Попробуйте следующее:

def is_header(line):
    return line[0] == '>'

def parse_multi_fasta_file_compressed_or_not(filename):
    if filename.endswith('.gz'):
        opener = lambda filename: gzip.open(filename, 'rt')
    else:
        opener = lambda filename: open(filename, 'r')

    with opener(filename) as f:
        fasta_iter = (it[1] for it in itertools.groupby(f, is_header))
        for name in fasta_iter:
            name = name.__next__()[1:].strip()
            sequences = ''.join(seq.strip() for seq in fasta_iter.__next__())
            yield name, sequences

Я также немного переставил вещи, чтобы вы могли использовать блок with, как и раньше. Условное начало присваивает opener функцию, которая может открывать данный файл в зависимости от того, распакован он или нет.

...