首页 > 解决方案 > 为什么它会以它的方式工作(rstrip)

问题描述

我有一个可以正常工作的代码,但我不明白。为什么之后buf[1:]只打印出Rosalind_4402没有DNA。法斯塔=

>Rosalind_4402
GCAGCTAGCTAGCTAGCTGGGATTCGGATCGGCGCCCCGAGAGGATTCTTTCAGCTGTAA
GAATTTATCCTCGATCGGGCTATAAAACCTACGCATATCTGCTAGCTGAGGGGCTATCTT
with open("rosalind_gc.txt") as FASTA:
    buf = FASTA.readline().rstrip()
    print(buf)
    while buf:
        seq_name, seq = buf[1:], ''
        print(seq_name)
        buf = FASTA.readline().rstrip()
        while not buf.startswith('>') and buf:
            seq = seq + buf
            buf = FASTA.readline().rstrip()
        print(seq)

标签: pythonbioinformaticsstripbiopython

解决方案


我的猜测是,您尝试从文件中获取一个或多个 fasta 序列,无论是由 BLAST 序列的名称列表还是仅由所有序列给出。使用以下脚本,您可以执行这两种类型的操作。

文件中的最后一行可能是 fasta 序列、行尾字符或其他内容。如果没有被覆盖,缓冲区的输出将中途停止。因此,您可以筛选 fasta 文件中的行尾字符或总行数。

旧版本的 fastafile 是不规则的,因此有时会有多个 '\n' 换行符或根本没有。两者都使用锁来处理。

享受。


def myseq(seq_file, seq_list=[]):
    # if sequence identifier list (seq_list) is zero then all sequences are returned; if a list is given the matched IDs return seq.
    buf = FASTA.readlines()
    
    lines = len(buf)
    count = 0
    
    lock = False
    identifier = ''
    string = ''
    result = []
    
    for item in buf:
        print(f'lock : {lock}, item {item}.')
                   
        if (item[0] == '>') and (lock == False):
            identifier = item.rstrip()
            
            # selection based on sequence name in list or empty list to get them all.
            if seq_list != []:
                for seq_name in seq_list:
                    if identifier == seq_name:
                        lock = True
            else:
                lock = True
        
        elif lock and (item[0] in ['A', 'C', 'G', 'T', 'U']):
            string += item.rstrip()
            
        count += 1 # count line positions in list.
        
        if lock and (item == '\n') or (count == lines):
            
            result.append((identifier, string))
            identifier = ''
            string = ''
            lock = False
                
    return result

with open('X:\Test\fasta.txt', encoding = 'utf-8') as FASTA:
#    print(FASTA.readlines())
    buf = myseq(FASTA)
    print(buf)

输出print(FASTA.readlines())

['\n', '>Rosalind_4402\n', 'GCAGCTAGCTAGCTAGCTGGGATTCGGATCGGCGCCCCGAGAGGATTCTTTCAGCTGTAA\n', 'GAATTTATCCTCGATCGGGCTATAAAACCTACGCATATCTGCTAGCTGAGGGGCTATCTT\n', '\n', '>Rosalind_4403\n', 'GCAGCTAGCTAGCTAGCTGGGATTCGGATCGGCGCCCCGAGAGGATTCTTTCAGCTGTAA\n', 'GAATTTATCCTCGATCGGGCTATAAAACCTACGCATATCTGCTAGCTGAGGGGCTATCTT']

推荐阅读