2012-07-06 8 views
5

파일을 한 줄씩 읽어야하고 '다음 줄'을 들여다 봐야합니다. 먼저 파일을 목록으로 읽은 다음 목록을 통과합니다 ... 어떻게 든이 것 같습니다. 무례한, 목록을 구축 비싼 될 수 있습니다.파일 액세스 앞두고

for line in open(filename, 'r'): 
    lines.append(line[:-1]) 

for cn in range(0, len(lines)): 
    line = lines[cn] 
    nextline = lines[cn+1] # actual code checks for this eof overflow 

는 라인을 반복하는 더 나은 방법이 있어야하지만 앞서

+2

이 왜 미리 들여다해야합니까? "엿보기"가 발생하는 코드와이를 사용하는 방법이 명확하지 않습니다. – unwind

+2

나는 그 부분을 앞으로 들여다 보았다. 그것은 큰 부분이었고, 앞으로의 문제인 – Paul

답변

6

이런 식으로 할 수 들여다하는 방법을 모른다 itertools의 pairwise 제조법과 같은 것입니다.

from itertools import tee, izip 
def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return izip(a, b) 

with open(filename) as f: # Remember to use a with block so the file is safely closed after 
    for line, next_line in pairwise(f): 
     # do stuff 
+1

의 문제를 밝히지 않았다.이 때 나에게 쉽지 않은 것이었지만, 내가 발가락에 서 있으면 나는 그것을 만질 수 있었다. – Paul

+0

oke, itertools에 대한 더 나은 이해를 얻지 만 ... 다음 (b, 없음)의 정확한 의미를 파악하지 못했습니다 ... – Paul

+1

@Paul iterator를 앞으로 이동하면 하나의 요소가됩니다. iterator에 요소가 남아 있지 않으면'StopIteration'이 발생합니다. 'next'는 에러가 발생하지 않고 리턴하는 디폴트 인자를받습니다. 'None'은 단지 자리 표시 자 (placeholder)로 사용됩니다. 반복의 끝에 도달했다면 어쨌든 그 값을 사용하지 않을 것이기 때문입니다. – jamylak

1

당신은 그에게 당신이 찾고 될 수

last_line = None 

for line in open(filename):                 
    if last_line is not None: 
     do_stuff(last_line, line) 
    last_line = line               
0

당신은 iterator 작성하고이 같이 할 수있는 :

f = open(filename, 'r') 
g = open(filename, 'r') 

y = iter(g.readlines()) 
y.__next__() 

for line in f: 
    print(line) 
    try: 
     print(y.__next__()) 
    except StopIteration: 
     f.close() 
     g.close() 
+0

'g'는 이미 파일 행을 반복하는 반복자이므로'y'가 필요 없습니다. 또한 당신이'__next__'를 호출 한 이후에 파이썬 3을 사용하고 있다고 가정합니다. 실제로 필요하다면'next (y) '를 사용해야합니다. 어쨌든 동일한 파일을 두 번 열어 보는 것은 좋지 않다고 생각합니다. 내 솔루션에서는이를 수행하기 위해'tee '를 사용합니다. 또한 파일을 닫거나'with' 블록을 사용해야합니다. – jamylak

+0

'next (y)'는 파이썬 3에서 작동하지 않습니다. 그리고 g는'TextIOWrapper' 객체입니다. 그래서 iterable 객체 인 경우에도'next()'메소드를 가지고 있지 않습니다. 그리고 네, 같은 파일을 두 번 열지 않는 것이 좋겠지 만 읽기 모드 일 때만 열리는 것이 좋습니다. 그렇게 생각하지 마십시오. – Vizard

+0

그래,'tee'를 사용하는 것이 더 나은 접근 방법 일 수 있지만 가능한 한 간단하게 만들려고했습니다. – Vizard