我有一个包含400,000个项目的字典,其键是DNA名称,值是DNA序列。 我想将字典分成40个文本文件,每个文件中有10,000个项目。
以下是我的代码:
record_dict # my DNA dictionary
keys_in_dict #the list of the keys
for keys in keys_in_dict:
outhandle = open("D:\\Research\\Transcriptome_sequences\\input{0}.fasta".format (?????), "w")
我应该用(?????)
代替什么?我该如何完成这个循环?
更新: 嘿伙计们, 谢谢您的帮助。现在我可以从字典中创建多个文件。但是,当我尝试直接从原始文件制作多个文件而不是先创建字典时,我遇到了问题。代码只生成一个文件,其中包含第一项。我做错了什么?这是我的代码:
from Bio import SeqIO
handle = open("D:/Research/Transcriptome_sequences/differentially_expressed_genes.fasta","rU")
filesize = 100 # number of entries per file
filenum = 0
itemcount = 0
for record in SeqIO.parse(handle, "fasta") :
if not itemcount % filesize:
outhandle = open("D:/Research/Transcriptome_sequences/input{0}.fasta".format(filenum), "w")
SeqIO.write(record, outhandle, "fasta")
filenum += 1
itemcount += 1
outhandle.close()
答案 0 :(得分:1)
n = 10000
sections = (record_dict.items()[i:i+n] for i in xrange(0,len(record_dict),n))
for ind, sec in enumerate(sections):
with open("D:/Research/Transcriptome_sequences/input{0}.fasta".format(ind), "w") as f1:
for k,v in sec:
f1.write("{} {}\n".format(k,v))
答案 1 :(得分:0)
它不是最快的解决方案,但我认为最直接的方法是跟踪行并通过循环每10,000次迭代打开一个文件。
我假设你正在写出fasta或其他东西。
否则,您可以预先对列表[:10000]
进行切片,并生成一块输出,以便使用一个命令一次性写入(这将更快)。即使它是这样,你可能想要通过连接循环然后用一个.write
命令为每个文件写出一个可怕的字符串来构建字符串。
itemcount=0
filesize = 10000
filenum = 0
filehandle = ""
for keys in keys_in_dict:
# check if it is time to open a new file,
# whenever itemcount/filesize has no remainder
if not itemcount % filesize:
if filehandle:
filehandle.close()
filenum+=1
PathToFile = "D:/Research/Transcriptome_sequences/input{0}.fasta".format(filenum)
filehandle = open(PathToFile,'w')
filehandle.write(">{0}\n{1}\n".format(keys,record_dict[keys])
itemcount += 1
filehandle.close()
编辑:这是一种更有效的方法(按时间顺序,而不是内存方式),每个文件只写一次(总共40次)而不是每行写入400,000次。与往常一样,检查输出,特别是确保输出中包含第一个和最后一个序列,并且正确写入最后一个文件。
filesize = 10 # number of entries per file
filenum = 0
filehandle = ""
OutString = ""
print record_dict
for itemcount,keys in enumerate(keys_in_dict):
# check if it is time to open a new file,
# whenever itemcount/filesize has no remainder
OutString += ">{0}\n{1}\n".format(keys,record_dict[keys])
if not itemcount % filesize:
if filehandle:
filehandle.write(OutString)
filehandle.close()
OutString =""
filenum+=1
PathToFile = "D:/Research/Transcriptome_sequences/input{0}.fasta".format(filenum)
filehandle = open(PathToFile,'w')
filehandle.write(OutString)
filehandle.close()
答案 2 :(得分:0)
利用内置模块/功能itertools.tee,可以优雅地解决这个问题。
import itertools
for (idx, keys2) in enumerate(itertools.tee(keys_in_dict, 40)):
with open('filename_prefix_%02d.fasta' % idx, 'w') as fout:
for key in keys2:
fout.write(...)
引自文档供您参考:
itertools.tee(iterable [,n = 2])从a返回n个独立迭代器 单一可迭代。
一旦tee()进行了拆分,就不应使用原始的iteable 其他地方;否则,迭代可以在没有 三通被告知。
这个itertool可能需要大量的辅助存储(取决于 需要存储多少临时数据)。一般来说,如果一个 迭代器在另一个迭代器启动之前使用大部分或全部数据, 使用list()而不是tee()会更快。