2012-03-14 2 views
3

С проблемой несколько лет сталкивается с проблемой python. Я биоинформатика без базовых навыков программирования, и я работаю с огромными текстовыми файлами (около 25 гб), которые мне приходится обрабатывать.Чтение строк из ОГРОМНЫХ текстовых файлов по группам из 4

Я должен прочитать файл txt по строкам по группам из 4 строк за раз, что означает, что первые 4 строки должны быть прочитаны и обработаны, а затем я должен прочитать вторую группу из 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...) 

К сожалению, это не possibile, так как файл в "чтении" режиме не может быть повторен и обработан как список или словарь.

Может ли кто-нибудь помочь в правильном цикле?

Заранее спасибо

+0

В файлах Python открыт для чтения может быть легко итерации в линейно-ориентированной манере - см раздел на 'file.next()' здесь: http://docs.python.org/library/stdtypes.html?highlight=file.next#file.next – martineau

ответ

2

Существует метод для чтения лениво больших файлов в Python here. Вы можете использовать этот подход и обрабатывать четыре строки за раз. Обратите внимание, что нет необходимости выполнять четыре операции чтения, а затем выполнять вашу обработку, а затем четыре операции считывания повторно. Вы можете читать фрагменты из нескольких сотен или тысяч строк из файла, а затем обрабатывать четыре строки за раз. Когда вы закончите с этими строками, вы можете продолжить чтение содержимого файла.

+0

Большинство всего, что вы говорите, правда, но создание многострочного chunk-ориентированная версия алгоритма легче сказать, чем сделать ... особенно для кого-то, у кого нет базовых навыков программирования. – martineau

1

Вы можете использовать бесконечный цикл, и вырваться из него, когда вы дойдете до конца файла.

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

    line2 = f.readline() 
    line3 = f.readline() 
    line4 = f.readline() 
    # process lines 
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() 

Примечание: Этот код предполагает, что файл не заканчивается с частичной группой.

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 специально для биоинформатики.

0

Вот способ сделать это, что я не могу взять кредит, но вполне разумно:

for name, seq, comment, qual in itertools.izip_longest(*[openfile]*4): 
    print name 
    print seq 
    print comment 
    print qual 
Смежные вопросы