私は非常に大きなtxt入力ファイルを処理する必要があり、通常は.readlines()を使用して最初にファイル全体を読み取り、それをリストに変換します。
私はそれが本当にメモリコストであり、かなり遅くなる可能性があることを知っていますが、以下のように特定の行を操作するためにLIST特性を利用する必要もあります。
#!/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()
一般的には全文の4行ごとに読み込もうとしていますが、4行目が希望の条件を満たしている場合は、この4行をテキストに追加します。それで、これを達成するためにreadlines()を避けることができますか?どうも
編集:こんにちは、実際に私自身がより良い方法を見つけました:
import commands
l1=commands.getoutput('zcat ' + fastqfile1).splitlines(True)
l2=commands.getoutput('zcat ' + fastqfile2).splitlines(True)
'zcat'は超高速だと思います....readlineに約15分かかりましたが、zcatだけに1分しかかかりませんでした...