![](/img/trans.png)
[英]How to write a single JSON from multiple JSON files with dictionary?
[英]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.