以4个为一组从HUGE文本文件中读取行

时间:2012-03-14 18:28:30

标签: python text-processing readline text-files

几天后我遇到了python的问题。我是一名没有基本编程技能的生物信息学,我正在处理大量文本文件(约25gb),我必须处理。

我必须逐行读取txt文件,每组4行,这意味着前4行必须被读取和处理,然后我必须读取第2组4行,所以上。

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

我考虑过使用范围运算符进行循环:

openfile = open(path, 'r')

for elem in range(0, len(openfile), 4):

line1 = readline()
line2 = readline()
line3 = readline()
line4 = readline()
(process lines...)

不幸的是,这是不可能的,因为处于“阅读”模式的文件不能被迭代并被视为列表或字典。

任何人都可以帮忙正确地循环吗?

提前致谢

5 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

你正在读一个fastq文件,对吗?你最有可能重新发明轮子 - 你可以使用Biopython,它有处理常见生物文件格式的工具。例如,参见this tutorial,对fastq文件做一些事情 - 看起来基本上是这样的:

from Bio import SeqIO
for record in SeqIO.parse("SRR020192.fastq", "fastq"):
    # do something with record, using record.seq, record.id etc

有关biopython SeqRecord对象的更多信息here

Here是另一个biopython fastq处理教程,包括使用较低级别库更快地执行此操作的变体,如下所示:

from Bio.SeqIO.QualityIO import FastqGeneralIterator
for title, seq, qual in FastqGeneralIterator(open("untrimmed.fastq")):
    # do things with title,seq,qual values

还有HTSeq package,有更多深度排序特定的工具,我实际上经常使用它们。

顺便说一下,如果你还不知道Biostar,你可以看看 - 它是专门用于生物信息学的StackExchange格式网站。

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

这是一种做到这一点的方式,我不能相信,但是非常合理:

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