我需要改进一个解析多 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
一个函数,该函数可以打开给定文件,具体取决于文件是否压缩。
大家好,我正在处理一个巨大的 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
一个函数,该函数可以打开给定文件,具体取决于文件是否压缩。