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

标签 python string-concatenation

我有一个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)

关于python - 将行连接到python中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37570238/

相关文章:

c++ - _bstr_t 连接给出 12142

python - 装饰器导致所有函数返回 True

python - 将多个参数传递给 tf.data.Datasets.from_generator 中的生成器

sql - 如何创建在 char(n) 中保留尾随空格的字符串连接运算符

python - 如何按列将一组数组中的元素作为带有分隔符的字符串连接起来

字符串常量的 C# 编译时连接

mysql - 如何在具有连接列的表达式之间使用

python - Django CharField 限制

python - 如何修复 Qtab 并在选项卡区域创建更多按钮和文本行

python - 使用 Django F 表达式或 "extra"SQL 来增加基于其他相关对象的字段值