2014-11-11 3 views
0

40,000 개의 항목이있는 사전이 있습니다. 그 키는 DNA 이름이고 값은 DNA 시퀀스입니다. 사전을 각 파일에 10,000 개의 항목이있는 40 개의 텍스트 파일로 나누고 싶습니다.사전에서 여러 개의 파일을 파이썬으로 작성하는 방법

여기 내 코드는 다음과 같습니다

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

각 키'keys'에 해당하는 값을 얻는 방법을 묻는 중입니까? 그것은 단지'record_dict [keys]'입니다. (또한, 각 키를 보유하고있는 변수의 이름을 한 번에 하나씩, 복수의'keys '로 오인하는 것은 잘못된 것 같습니다 ...) – abarnert

+0

참고로 사전의 키 목록은 거의 필요하지 않습니다. 'for key in record_dict :'를 반복하면된다. 또는'record_dict.items() :'의 key, value를 위해 반복 할 수 있고 루프 안에서'record_dict [key]'를 할 필요가 없습니다. – abarnert

+0

감사합니다, abarnert. 간단히 말하면, 400,000 개의 항목이있는 큰 파일이 있고이 파일을 각 작은 파일에 10,000 개의 항목이있는 40 개의 작은 파일로 나누고 싶습니다. – Gray

답변

0

,하지만 가장 straightforwared 방법은 라인을 추적 및 루프를 통해 파일마다 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 배 전체) 당 한 번만 작성을 대신 각 줄 수있는보다 효율적인 방법입니다 (40 회) . 항상 그렇듯이 출력을 확인하십시오. 특히 첫 번째 시퀀스와 마지막 시퀀스가 ​​출력에 포함되고 마지막 파일이 올바르게 기록되는지 확인하십시오. 내장 된 모듈/기능, itertools.tee

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() 
+0

맞아. 나는 빠른 형식을 쓰고있다. 또 다른 질문은 전체 시퀀스 번호가 정수가 아닐 수도 있다는 것입니다. 그것은 399, xxx 무언가 일 수 있습니다. – Gray

+0

파일 핸들이 정의되어 있지 않습니다. if filehandle 줄 앞에 filehandle 줄을 옮겨야합니까? – Gray

+0

filehandle.write ("OUTPUT TEXT HERE \ n")에 무엇을 넣어야합니까? 각 유전자에 대한 각 파일을 만듭니다. – Gray

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)) 
+0

고맙습니다, Padraic. 나는 지금 그것을 시도하고있다. – Gray

+0

그냥 10,000 번째 항목마다 씁니다. 나머지는 쓰지 않나요? – beroe

+0

"writelines() 인수는 문자열 순서 여야합니다." – Gray

0

만들기 사용, 우아하게이 문제를 해결 할 수있다. 참조 용 문서에서 인용

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 (반복 가능한 [N = 2) 복귀 n은 번의 반복 가능한 독립적 반복자.

일단 tee()가 분할을 수행하면 원래의 반복 가능 문자는 다른 곳에서는 사용하지 말아야합니다. 그렇지 않으면 티 객체가 알려지지 않고 반복 가능이 향상 될 수 있습니다.

이 itertool에는 상당한 보조 기억 장치가 필요할 수 있습니다 ( 에 따라 얼마만큼의 임시 데이터를 저장해야하는지). 일반적으로 하나의 반복자가 다른 반복자가 시작되기 전에 대부분 또는 모든 데이터를 사용하면 은 tee() 대신 list()를 사용하는 것이 빠릅니다.

+0

니스, 드레이크. 이것을하는 또 다른 방법. 매우 계몽! – Gray

관련 문제