перебирать огромный текстовый файл: читать куски между двумя повторяющимися шаблонами, используя python - PullRequest
0 голосов
/ 15 декабря 2018

Мне нужно пройти через огромный (20 ГБ, слишком большой для памяти) текстовый файл биологической последовательности (БД GeneBank) и извлечь ту же информацию для каждой записи в БД.и каждая запись начинается со строки LOCUS XYZ some more text и заканчивается строкой //.в качестве примера:

LOCUS 123 some more text many lines of some more text many lines of some more text many lines of some more text // LOCUS 231 some more text many lines of some more text many lines of some more text many lines of some more text // LOCUS 312 some more text many lines of some more text many lines of some more text many lines of some more text //

Теперь есть ли способ сказать Python итеративно читать соответствующие 3 фрагмента этого файла в некоторую переменную var.чтобы быть более точным:

итерация 1: var =

LOCUS 123 some more text many lines of some more text many lines of some more text many lines of some more text //

итерация 2: var =

LOCUS 231 some more text many lines of some more text many lines of some more text many lines of some more text //

итерация 3: var =

LOCUS 312 some more text many lines of some more text many lines of some more text many lines of some more text //

большое спасибо заранее и всего наилучшего в наступающих праздниках

1 Ответ

0 голосов
/ 15 декабря 2018

Предполагая, что у нас есть следующий текстовый файл:

LOCUS 421 bla bla ba
Lorem ipsum dolor sit amet, 
consectetur adipiscing elit. 
Duis eu erat orci. Quisque 
nec augue ultricies, dignissim 
neque id, feugiat risus.
//
LOCUS 421 blabla
Nullam pulvinar quis ante
at condimentum.
//

мы могли бы сделать:

is_processing = True

pf = open("somefile.txt", "r")

# Handles chunks
while True:
    first_chunk_line = True
    chunk_lines = []

    # Handles one chunk
    while True:
        data_line = pf.readline()

        # detect the end of the file
        if data_line == '':
            is_processing = False
            break

        # Detect first line
        if first_chunk_line:
            if "LOCUS" not in data_line:
                raise Exception("Data file is malformed!")

            first_chunk_line = False
            continue  # don't process the line
        # Detect end of locus / chunk
        if data_line.strip() == "//":
            break

        # if it is neither a first line, and end line nor the end of the file
        # then it must be a chunk line holding precious DNA information
        chunk_lines.append(data_line)

    # end the while loop
    if not is_processing:
        break

    # do something with one chunk lines
    print(chunk_lines)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...