我需要改进一个解析多 fasta 文件的函数,使用 try execpt 处理检查压缩

I need to improve a function that parses a multi fasta file, checking for compression with a try execpt handling

大家好,我正在处理一个巨大的 gz 压缩 fasta 文件,我有一个很好的 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

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

我尝试修改了标识。 Python 不抱怨任何错误。但是,它不会打印或显示任何结果。我正在使用一个包含 5 个序列的玩具文件。

提醒一下 fasta 文件是这样的:

>header_1
AATATATTCAATATGGAGAGAATAAAAGAACTAAGAGATCTAATGTCACAGTCTCGCACTCGCGAGATAC
TCACCAAAACCACTGTGGACCACATGGCCATAATCAAAAAGTACACATCAGGAAGGCAAGAGAAGAACCC
TGCACTCAGGATGAAGTGGATGATG
>header_2
AACCATTTGAATGGATGTCAATCCGACTTTACTTTTCTTGAAAGTTCCAGCGCAAAATGCCATAAGCACC
ACATTTCCCTATACTGGAGACCCTCC

我想使用一些 try:... except:... 而不是 if
如果你们有任何提示可以帮助我解决这个问题,我将不胜感激(这根本不是任何课程练习!)。

感谢您的宝贵时间。

保罗

您的 `for 循环似乎缩进了太多。请尝试以下操作:

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 一个函数,该函数可以打开给定文件,具体取决于文件是否压缩。