簡體   English   中英

如何在python中從字典中寫入多個文件

[英]How to write multiple files from a dictionary in python

我有一本字典,其中有40萬項內容,其鍵是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()
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))

這不是最快的解決方案,但我認為最簡單的方法是跟蹤行並通過循環每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()

利用內置的模塊/功能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])從單個iterable返回n個獨立的迭代器。

一旦tee()進行了拆分,原始的可迭代對象就不應在其他任何地方使用; 否則,迭代器可能會提前,而不會通知tee對象。

此itertool可能需要大量輔助存儲(取決於需要存儲多少臨時數據)。 通常,如果一個迭代器在另一個迭代器啟動之前使用了大部分或全部數據,則使用list()而不是tee()更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM