在Python文本文件中查找图章

2024-09-24 22:24:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个像这样的大文本文件:

示例:

>chr9:128683-128744
GGATTTCTTCTTAGTTTGGATCCATTGCTGGTGAGCTAGTGGGATTTTTTGGGGGGTGTTA
>chr16:134222-134283
AGCTGGAAGCAGCGTGGGAATCACAGAATGGCCGGGACCTTAAAGGCTTTGCTTGGCCTGG
>chr16:134226-134287
GGAAGCAGCGTGGGAATCACAGAATGGACGGCCGATTAAAGGCTTTGCTTGGCCTGGATTT
>chr1:134723-134784
AAGTGATTCACCCTGCCTTTCCGACCTTCCCCAGAACAGAACACGTTGATCGTGGGCGATA
>chr16:135770-135831
GCCTGAGCAAAGGGCCTGCCCAGACAAGATTTTTTAATTGTTTAAAAACCGAATAAATGTT

这个文件被分成不同的部分,每个部分有2行。第一行以>(这一行称为ID)开头,第二行是字母序列。 我想在字母序列中搜索一个短的motif(GGAC),如果它们包含motif,我想得到那一行的ID(在那上面一行)。你知道吗

对于上述示例,以下是预期输出:

预期产量:

>chr16:134222-134283
>chr16:134226-134287

我试图在python中使用以下命令来实现这一点,但它并没有返回我想要的结果。你知道吗

infile = open('infile.txt', 'r')
ss = 'CCGA'
new = []
for line in range(len(infile)):
    if not infile[line].startswith('>'):
        for match in pattern.finder(ss):
            new.append(infile[line-1])

你知道怎么修吗?你知道吗


Tags: inid示例newfor字母line序列
2条回答

在这里使用发电机可能很方便。你知道吗

def find_motif(f, motif):
    while True:
        try:
            id_line = next(f)
            text_line = next(f)
        except StopIteration:
            break
        if motif in text_line:
            yield id_line

with open("my file") as f:
    with_motif = find_motif(f, "ABCD")
    for id_line in with_motif:
        print(id_line) 

所以:

text = """>chr9:128683-128744
GGATTTCTTCTTAGTTTGGATCCATTGCTGGTGAGCTAGTGGGATTTTTTGGGGGGTGTTA
>chr16:134222-134283
AGCTGGAAGCAGCGTGGGAATCACAGAATGGCCGGGACCTTAAAGGCTTTGCTTGGCCTGG
>chr16:134226-134287
GGAAGCAGCGTGGGAATCACAGAATGGACGGCCGATTAAAGGCTTTGCTTGGCCTGGATTT
>chr1:134723-134784
AAGTGATTCACCCTGCCTTTCCGACCTTCCCCAGAACAGAACACGTTGATCGTGGGCGATA
>chr16:135770-135831
GCCTGAGCAAAGGGCCTGCCCAGACAAGATTTTTTAATTGTTTAAAAACCGAATAAATGTT"""
f = iter(text.splitlines())

with_motif = find_motif(f, "GGAC")
for id_line in with_motif:
    print(id_line)

输出:

>chr16:134222-134283
>chr16:134226-134287

Biopython用于此目的将更加健壮和简单:

from Bio import SeqIO

motif = 'GGAC'
for record in SeqIO.parse('input.fa', 'fasta'):
    if motif in record.seq:
        print(record.id)

相关问题 更多 >