나는 초대형 txt 입력 파일을 다룰 필요가있다. 나는 보통 .readlines()를 사용하여 먼저 전체 파일을 읽고 그것을 목록으로 바꾼다. 나는 시도하고 일반적으로readlines() 사용을 피하는 방법은 무엇입니까?
#!/usr/bin/python
import os,sys
import glob
import commands
import gzip
path= '/home/xxx/scratch/'
fastqfiles1=glob.glob(path+'*_1.recal.fastq.gz')
for fastqfile1 in fastqfiles1:
filename = os.path.basename(fastqfile1)
job_id = filename.split('_')[0]
fastqfile2 = os.path.join(path+job_id+'_2.recal.fastq.gz')
newfastq1 = os.path.join(path+job_id+'_1.fastq.gz')
newfastq2 = os.path.join(path+job_id+'_2.fastq.gz')
l1= gzip.open(fastqfile1,'r').readlines()
l2= gzip.open(fastqfile2,'r').readlines()
f1=[]
f2=[]
for i in range(0,len(l1)):
if i % 4 == 3:
b1=[ord(x) for x in l1[i]]
ave1=sum(b1)/float(len(l1[i]))
b2=[ord(x) for x in str(l2[i])]
ave2=sum(b2)/float(len(l2[i]))
if (ave1 >= 20 and ave2>= 20):
f1.append(l1[i-3])
f1.append(l1[i-2])
f1.append(l1[i-1])
f1.append(l1[i])
f2.append(l2[i-3])
f2.append(l2[i-2])
f2.append(l2[i-1])
f2.append(l2[i])
output1=gzip.open(newfastq1,'w')
output1.writelines(f1)
output1.close()
output2=gzip.open(newfastq2,'w')
output2.writelines(f2)
output2.close()
:
나는 정말 메모리 비용이고 매우 느릴 수 있습니다 알고 있지만, 나는 또한, 특정 라인을 조작 할 수 LIST 특성을 활용 아래와 같이 필요 전체 텍스트의 4 번째 줄을 읽지 만, 4 번째 줄이 원하는 조건을 충족하면이 4 줄을 텍스트에 추가합니다. 이렇게하려면 readlines()를 피할 수 있습니까? 들으
편집 : 안녕하세요, 실제로 나 자신이 더 나은 방법을 발견 : 내가 생각
import commands
l1=commands.getoutput('zcat ' + fastqfile1).splitlines(True)
l2=commands.getoutput('zcat ' + fastqfile2).splitlines(True)
'을 zcat은'슈퍼 빠른 .... 그것은 readlines 메쏘드에 15 분 주위했다입니다 1 분 동안 단지 zcat에 ...
이것은 간단한 방법입니다. 아담의 제안이 더 좋은 방법입니다. –