Skip to main content
 首页 » 编程设计

python之将行连接到python中的字符串

2025年05月04日34qq78292959

我有一个fasta文件如下:

>scaf1 
AAAAAATGTGTGTGTGTGTGYAA 
AAAAACACGTGTGTGTG 
>scaf2 
ACGTGTGTGTGATGTGGY 
AAAAAATGTGNNNNNNNNYACGTGTGTGTGTGTGTACACWSK 
>scaf3 
AAAGTGTGTTGTGAAACACACYAAW 

我想将它读入字典中,属于一个序列的多行转到一个键,输出将是:

{'scaf1': 'AAAAAATGTGTGTGTGTGTGYAAAAAAACACGTGTGTGTG', 'scaf2': 'ACGTGTGTGTGATGTGGYAAAAAATGTGNNNNNNNNYACGTGTGTGTGTGTGTACACWSK', 'scaf3': 'AAAGTGTGTTGTGAAACACACYAAW'} 

我写的脚本是:

import sys 
from collections import defaultdict 
 
fastaseq = open(sys.argv[1], "r") 
 
def readfasta(fastaseq): 
    fasta_dict = {} 
    for line in fastaseq: 
        if line.startswith('>'): 
            header = line.strip('\n')[1:] 
            sequence = '' 
        else: 
            sequence = sequence + line.strip('\n') 
        fasta_dict[header] = sequence  
    return fasta_dict 
 
fastadict = readfasta(fastaseq) 
print fastadict 

对于这样的文件,它可以正确且快速地工作,但是当文件大小增加时(大约 1.5 Gb),它就会变得太慢。花费时间的步骤是 sequence 的串联部分。我想知道是否有更快的方法将这些行连接成一个字符串?

请您参考如下方法:

用 + 连接字符串需要创建一个新字符串,因为 Python 字符串是不可变的,这很耗时。

使用str.join在所有字符串都准备好后连接它们,

import sys 
 
def read_fasta(filename): 
    fasta_dict = {} 
    l = list() 
    header = None 
    with open(filename, 'r') as f: 
        for line in f: 
            if line.startswith('>'): # a new record 
                # save the previous record to the dict 
                if header: 
                    fasta_dict[header] = ''.join(l)  
                    del l[:]    # empty the list 
 
                header = line.strip().split('>')[1] 
            else: 
                l.append(line.strip()) 
 
        # save the last record 
        fasta_dict[header] = ''.join(l)  
 
    return fasta_dict 
 
fastadict = read_fasta(sys.argv[1]) 
print(fastadict)