Читайте строки из огромных текстовых файлов в группах по 4 - PullRequest
3 голосов
/ 14 марта 2012

Я столкнулся с проблемой с питоном уже несколько дней.Я биоинформатик, не обладаю базовыми навыками программирования, и я работаю с огромными текстовыми файлами (около 25 ГБ), которые мне нужно обработать.

Мне нужно построчно читать txt-файл группами по 4 строкивремя, что означает, что первые 4 строки должны быть прочитаны и обработаны, а затем я должен прочитать вторую группу из 4 строк и т. д.

Очевидно, я не могу использовать оператор readlines (), потому что онперегрузит мою память, и мне придется использовать каждую из 4 строк для распознавания некоторых строк.

Я думал об использовании цикла для с оператором range :

openfile = open(path, 'r')

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

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

К сожалению, это невозможно, поскольку файл в режиме «чтения» не может быть повторен и рассматриваться как список илисловарь.

Кто-нибудь может помочь, пожалуйста, чтобы это правильно перевернуть?

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

Ответы [ 5 ]

5 голосов
/ 14 марта 2012

Это имеет низкий объем памяти. Он рассчитывает на то, что файл является итератором, который читает по строке.

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 голосов
/ 04 апреля 2012

Вы читаете файл fastq, верно?Скорее всего, вы заново изобретаете колесо - вы можете просто использовать Biopython , у него есть инструменты для работы с общими форматами файлов биологии.Например, см. этот учебник , чтобы что-то делать с файлами fastq - в основном это выглядит так:

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

Подробнее о объектах SeopyRecord здесь .

Здесь - еще одно учебное пособие по быстрой обработке биопиона, включая вариант, позволяющий сделать это быстрее с помощью библиотеки нижнего уровня, например:

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

Также есть Пакет HTSeq , с более специфичными инструментами для более глубокого секвенирования, которые я на самом деле использую чаще.посмотрите - это сайт формата StackExchange специально для биоинформатики.

2 голосов
/ 14 марта 2012

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

2 голосов
/ 14 марта 2012

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

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

    line2 = f.readline()
    line3 = f.readline()
    line4 = f.readline()
    # process lines
0 голосов
/ 07 декабря 2013

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

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