2013-04-05 1 views
2

У меня есть большой файл журнала (> 1 ГБ), который нужно проанализировать, поэтому я написал программу python. Я использовал islice, чтобы я мог прочитать файл в кусках (10 000 строк), чтобы на моем сервере не хватило памяти.Python islice читает те же строки

Я искал некоторые решения для stackoverflow и реализовал один, но программа работает не так, как ожидалось, потому что isclice читает одни и те же строки каждый раз (но останавливается правильно после прочтения всего файла ...). Я не могу использовать with open, потому что он поставляется с Python 2.5, у меня есть питон 2,4 ...

Мой код выглядит следующим образом:

n = 100000;  # n lines 
    inf = open(fn, "r") 
    while True: 
     next_n_lines = list(islice(inf, n)) 
     if not next_n_lines: 
      break 
     out_fn = produce_clean_logfile(next_n_lines) 
     a, t = main(out_fn) 
     send_log(a,t) 

Вы знаете, что случилось?

Заранее спасибо. С уважением, Джон.

+1

Я попытался с Ислицей из itertools, и она работает. Итак, ваша реализация islice неправильная, вы должны опубликовать ее, если хотите получить помощь. – lc2817

+0

В дополнение к моему сценарию я написал 'from itertools import islice' ... или что вы имеете в виду? Мой код 'islice' находится в моем вопросе-тексте ... –

+1

Вы правы, должна быть другая проблема. Я тестировал его с немым 20-строчным файлом, и он работает, поэтому мне нужно искать в другом месте! спасибо за Ваш ответ! –

ответ

3
from itertools import islice 
n = 2;  # n lines 
fn = "myfile" 
inf = open(fn, "r") 
while True: 
    next_n_lines = list(islice(inf, n)) 
    if not next_n_lines: 
     break 
    print next_n_lines 

работает для меня на python 2.5, 2.6, 2.7 => Я могу видеть строки, отображаемые в порядке.

Ошибка, безусловно, исходит из ваших других функций, не могли бы вы обновить свой вопрос?

+0

Вы правы, должна быть другая проблема. Я тестировал его с немым 20-строчным файлом, и он работает, поэтому мне нужно искать в другом месте! спасибо за Ваш ответ! –

2

Вы можете использовать GroupBy для этого

from itertools import groupby, count 
with open(filename, 'r') as datafile: 
    groups = groupby(datafile, key=lambda k, line=count(): next(line)//10000) 
    for k, group in groups: 
     for line in group: 
      ...