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