Мне нужно иметь дело с очень большими входными 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 () для достижения этой цели?
ТНХ
EDIT:
Привет, на самом деле я сам нашел лучший способ:
import commands
l1=commands.getoutput('zcat ' + fastqfile1).splitlines(True)
l2=commands.getoutput('zcat ' + fastqfile2).splitlines(True)
Я думаю, что 'zcat' супер быстрый ....
Чтение строк заняло около 15 минут, в то время как zcat - всего 1 минута ...