Чтение определенного количества строк из файла без сохранения в памяти? - PullRequest
0 голосов
/ 04 ноября 2019

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

Файлы отформатированы следующим образом:

4 # Number of lines per block
0 # Start of block 0
A line of data
A line of data
A line of data
A line of data
1 # Start of block 1
A line of data
A line of data
...

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

Вот что у меня есть:

required_block = 5
ilepath = file.txt
data = []

with open(filepath, 'r') as f:
    block_length = int(f.readline())
    for line in f:
        block = int(line)
        if block != required_block:
            for _ in range(block_length)
                next(f)
        else:
            break
    for line in f:
        data.append(line)

Если я попытаюсь добавить диапазон кпоследний цикл 'for' будет просто читать текущую строку снова и снова.

Где я ошибаюсь?

РЕДАКТИРОВАТЬ: Для пояснения, я хочу, чтобы только последний цикл for выполнялся количество раз.

Ответы [ 3 ]

0 голосов
/ 04 ноября 2019

Чтение файла построчно:

filepath = 'Iliad.txt'
    with open(filepath) as fp:
       line = fp.readline()
       cnt = 1
       while line:
           print("Line {}: {}".format(cnt, line.strip()))
           line = fp.readline()
           cnt += 1
0 голосов
/ 04 ноября 2019

Попробуйте изменить свой последний цикл следующим образом:

for _ in range(block_length):
    data.append(f.readLine())
0 голосов
/ 04 ноября 2019

Если вы посмотрите на свой код, ваш последний цикл for является виновником. Вы говорите, чтобы добавить все, несмотря ни на что. В вашем первом цикле for вы вообще ничего не добавляете. По сути, в первом цикле он просто проходит через данные, затем во втором он добавляет все, потому что добавление находится за пределами логики.

I думаю, что то, что вы хотите, является чем-то вродеэто:

for line in f:
        block = int(line)
        if block != required_block:
            next(f)
        else:
            for _ in range(block_length):
                data.append(line)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...