Python 2.7: как читать только несколько строк одновременно из файла? - PullRequest
2 голосов
/ 13 июля 2011

Например, у меня есть 2000 строк в файле, и я хочу прочитать 500 строк за раз и что-то сделать с этими 500 строками, прежде чем читать еще 500 строк. Интересно, кто-нибудь напишет какой-нибудь быстрый код, чтобы я мог его изучить? Спасибо!

Ответы [ 3 ]

7 голосов
/ 13 июля 2011

Вы можете использовать генератор, чтобы сгруппировать строки и получить их так, чтобы их было удобно использовать в простом цикле for.Это может привести к началу работы:

def chunks_of(iterable, chunk_size=500):
    out = []
    for item in iterable:
        out.append(item)
        if len(out) >= chunk_size:
            yield out
            out = []
    if out:
        yield out

Затем вы можете использовать это как:

for chunk_of_lines in chunks_of(file('/path/to/file'), chunk_size=500):
    # chunk_of_lines is 500 or fewer lines from the file

(Почему "500 или меньше"? Потому что последний блок может быть не 500 строк, есликоличество строк в файле не кратно 500.)

Редактировать: Всегда сначала проверяйте документы.Вот рецепт из документов itertools

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

Это создает список из n итераторов для итерируемого (в данном случае, файлового объекта) - так каквсе они являются итераторами одного и того же базового объекта, когда один продвигается, все остальные тоже продвигаются - и затем архивируют свой результат.izip_longest работает как izip, но добавляет результаты к fillvalue, а не просто пропускает их, как моя функция chunks_of.

0 голосов
/ 13 июля 2011

Поправьте меня, но я думаю, что этот очень простой пример тоже будет работать:

linesToProceed = 500
with open(filename, 'r') as f:
    lines = []
    for i,line in enumerate(f):
        if (i + 1) % linesToProceed:
            # do something with lines in lines
            lines = []
        else:
            lines.append(line)
0 голосов
/ 13 июля 2011

Вы также можете использовать itertools.islice для чтения 500 строк одновременно:

lines = itertools.islice(file_obj, 500)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...