我有一个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
的连接部分。我想知道是否有更快的方法将行连接到单个字符串?
答案 0 :(得分:5)
使用+
连接字符串需要创建一个新字符串,因为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)