2013-04-05 2 views
2

큰 로그 파일 (> 1GB)을 분석해야하므로 파이썬 프로그램을 작성했습니다. islice을 사용하여 청크 (10,000 줄)로 파일을 읽을 수 있으므로 서버의 메모리가 부족하지 않게되었습니다.Python islice가 같은 줄을 읽습니다.

stackoverflow에서 일부솔루션을 찾았지만 isclice가 매번 동일한 라인을 읽으므로 프로그램이 예상대로 작동하지 않습니다 (그러나 전체 파일을 읽은 후 올바르게 중지됩니다 ...).

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) 

당신은 무엇이 잘못 알아 :이 파이썬 2.5과 함께 제공하기 때문에 나는

내 코드처럼 보이는, 내가 ... 파이썬 2.4이 with open을 사용할 수 없습니다? 사전에

감사합니다. 안심하시기 바랍니다. 감사합니다.

+1

에 대한 GROUPBY을 사용할 수 있습니다 나는 itertools에서 islice으로 시도하고 작동합니다. 위법 구현이 잘못되었으므로 도움을 받으려면 게시해야합니다. – lc2817

+0

내 스크립트의 맨 위에 나는'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 

나를 위해 파이썬 2.5, 2.6, 2.7에서 작동합니다.> 순서대로 표시된 줄을 볼 수 있습니다.

실수로 다른 기능에서 오류가 발생했습니다. 질문을 업데이트 할 수 있습니까?

+0

맞습니다. 또 다른 문제가 있습니다. 나는 멍청한 20 라인 파일로 테스트 해봤는데 작동하기 때문에 다른 장소에서 검색해야한다! 당신의 대답에 감사드립니다! –

2

당신이

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: 
      ... 
관련 문제