几天后我遇到了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...)
不幸的是,这是不可能的,因为处于“阅读”模式的文件不能被迭代并被视为列表或字典。
任何人都可以帮忙正确地循环吗?
提前致谢
答案 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