如何在python中从字典中编写多个文件

时间:2014-11-11 01:29:18

标签: python dictionary

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

3 个答案:

答案 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()会更快。