Python 以4人一组的方式从大型文本文件中读取行

Python 以4人一组的方式从大型文本文件中读取行,python,text-processing,readline,text-files,Python,Text Processing,Readline,Text Files,几天后,我就面临python的问题。我是一个没有基本编程技能的生物信息学者,我正在处理巨大的文本文件(大约25gb),我必须处理这些文件 我必须一行一行地读取txt文件,每次读取4行,这意味着必须读取和处理前4行,然后读取第二组4行,依此类推 显然,我不能使用readlines()操作符,因为它会使我的内存过载,我必须使用4行中的每一行来进行字符串识别 我考虑过在range操作符中使用for循环: openfile=open(路径'r') 对于范围内的元素(0,len(openfile),4):

几天后,我就面临python的问题。我是一个没有基本编程技能的生物信息学者,我正在处理巨大的文本文件(大约25gb),我必须处理这些文件

我必须一行一行地读取txt文件,每次读取4行,这意味着必须读取和处理前4行,然后读取第二组4行,依此类推

显然,我不能使用readlines()操作符,因为它会使我的内存过载,我必须使用4行中的每一行来进行字符串识别

我考虑过在range操作符中使用for循环:

openfile=open(路径'r')

对于范围内的元素(0,len(openfile),4):

不幸的是,这是不可能的,因为“读取”模式下的文件不能被迭代,不能像列表或字典一样处理

谁能帮我把这个循环好吗


提前感谢

您可以使用无限循环,并在到达文件末尾时中断循环

while True:
    line1 = f.readline()
    if not line1:
        break

    line2 = f.readline()
    line3 = f.readline()
    line4 = f.readline()
    # process lines

在Python中有一种惰性读取大文件的方法。您可以使用这种方法,一次处理四行。请注意,不必执行四次读取操作,然后重复执行处理和四次读取操作。您可以从文件中读取几百或几千行的块,然后一次处理四行。完成这些行后,您可以继续读取文件内容。

这具有较低的内存开销。它依赖于这样一个事实,即文件是一个逐行读取的迭代器

def grouped(iterator, size):
    yield tuple(next(iterator) for _ in range(size))
像这样使用它:

for line1, line2, line3, line4 in grouped(your_open_file, size=4):
    do_stuff_with_lines()
from Bio import SeqIO
for record in SeqIO.parse("SRR020192.fastq", "fastq"):
    # do something with record, using record.seq, record.id etc
from Bio.SeqIO.QualityIO import FastqGeneralIterator
for title, seq, qual in FastqGeneralIterator(open("untrimmed.fastq")):
    # do things with title,seq,qual values

注意:此代码假定文件不以部分组结尾

您正在读取一个fastq文件,对吗?你很可能正在重新发明轮子——你可以使用它,它有处理普通生物文件格式的工具。例如,请参阅,对于使用fastq文件执行某些操作,它基本上如下所示:

for line1, line2, line3, line4 in grouped(your_open_file, size=4):
    do_stuff_with_lines()
from Bio import SeqIO
for record in SeqIO.parse("SRR020192.fastq", "fastq"):
    # do something with record, using record.seq, record.id etc
from Bio.SeqIO.QualityIO import FastqGeneralIterator
for title, seq, qual in FastqGeneralIterator(open("untrimmed.fastq")):
    # do things with title,seq,qual values
更多关于biopython SeqRecord对象的信息

是另一个biopython fastq处理教程,包括使用较低级别库加快处理速度的变体,如下所示:

for line1, line2, line3, line4 in grouped(your_open_file, size=4):
    do_stuff_with_lines()
from Bio import SeqIO
for record in SeqIO.parse("SRR020192.fastq", "fastq"):
    # do something with record, using record.seq, record.id etc
from Bio.SeqIO.QualityIO import FastqGeneralIterator
for title, seq, qual in FastqGeneralIterator(open("untrimmed.fastq")):
    # do things with title,seq,qual values
还有一种方法,有更深入的特定于排序的工具,我实际上更经常地使用这些工具


顺便说一句,如果你还不知道,你可以看看——这是一个专门针对生物信息学的StackExchange格式的网站。

以下是一种我无法相信但非常合理的方法:

for name, seq, comment, qual in itertools.izip_longest(*[openfile]*4):
    print name
    print seq
    print comment
    print qual

您所说的大部分都是正确的,但是制作一个面向多行块的算法版本说起来容易做起来难…特别是对于没有基本编程技能的人来说。在Python中,打开阅读的文件可以很容易地以面向行的方式进行迭代-请参阅
file.next()
部分: