2012-02-07 1 views
5

이 같은 루프를 사용하여 파일을 읽고있다 ...파일 반복, 내가 앞서 그것의 줄에서 항목을 취할 필요 읽어 각 행을 제외하고 라인이 존재

f = open("somefile.txt") 

for line in f: 
    do stuff 

을 확인하고 현재 줄에 넣으십시오. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 다음 행을 읽거나 읽지 않고 항목을 가져 오는 방법이 있습니까? 파일이 큰없는 경우

+0

아니면 다음 줄이 있는지 읽어보기 전에 어떻게해야합니까? –

+0

'현재 줄에 넣으시겠습니까?' 당신은 선에 데이터가있는 하드 드라이브의 기록 된 라인을 수정하고 싶습니까? – eyquem

답변

6

, 당신은 차례로 각 라인에서 작업 할 : @eyquem 제안, 당신은 두 번 파일을 열 수 있습니다 다음 줄에서 내 제안은 현재 읽고있는 값을 저장하고 마지막 값으로 작업하는 것입니다. 역순으로 작업하십시오 - last_line이 현재 라인이고 라인이 다음 라인입니다.

last_line = None 

with open("somefile.txt") as f: 
    for line in f: 
     if not last_line == None: 
      do_stuff(last_line, extract_needed_part(line)) 
     last_line = line 
do_stuff(last_line) #The final line without anything following it. 

수학적 용어로, 라인 n과 라인 n + 1 대신 라인 n-1과 라인 n을하십시오. 같은 효과.

이 방법의 장점은 처음에 전체 파일을로드하는 것이 아닙니다.

+0

나는 당신의 대답을 투표 할 수 있었으면 좋겠지 만, 불행히도 나는 아직 15 평판이 없다. 고맙습니다. 도움이되는 것으로 알고 있습니다. –

+0

@ user1178682 문제를 해결 한 경우 내 대답을 수락 할 수 있습니다. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 –

3

, 당신은 메모리에 읽을 수 거기 사용 :

f = open("somefile.txt") 
lines = f.readlines() 
f.close() 

for index, value in enumerate(lines): 
    # Check if next line exists 
    if index + 1 > len(lines): 
     next_line = lines(index + 1) 
     # do something with line and next_line 

편집 :

를 큰 파일의 경우, 그것은 단지 이전을 기억하는 가장 쉬운 것 줄 :

f = open("somefile.txt") 
previous_line = f.readline() 
for line in f: 
    # Do something with line and previous_line 
    print(line, previous_line) 
    # Save this line for the next iteration 
    previous_line = line 

데이터의 모양에 따라 엣지 케이스가있을 수 있습니다. 라인이 항상 쌍으로되어 있는지 또는 특정 상황에서 다음 라인의 정보가 약간 필요합니다.

예를 들어 파일에 한 줄만있는 경우이 코드는 아무 것도하지 않습니다. 파일이 메모리에 들어가는 경우

+0

문제는 파일이 상당히 크다는 것입니다. 처음에는 모든 줄을 메모리에 저장하지 않고 처리하려고합니다. 나는 내가 모르는 어떤 방법이 있기를 바랐다. 그래도 다른 모든 방법이 실패하면 좋은 백업 옵션입니다. 답장을 보내 주셔서 감사합니다. –

+0

예를 들어, 귀하의 편집에 대한, 꽤 많은 내 대답을 반복합니다, 당신과 함께 사용해야합니다 (해야합니다) 및 첫 번째 실행, previous_line 및 줄 동일합니다. –

+0

실제 코드에서 with (호환성을 위해) 대신 IOException 절을 사용합니다. 이것은 파일이 존재한다고 가정 할 수있는 더 일반화 된 것이며 오류를 반환하지 않습니다. 그럼에도 불구하고 합의는 단순히 이전 행에 매달리는 것으로 보인다. 최선의 방법이라면, 나는 그것을 사용할 것입니다. –

0

, 당신은 이런 식으로 뭔가를 시도 할 수 있습니다 :

f = open('somefile.txt') 
lines = f.read().splitlines() 

for current_line, next_line in zip(lines, lines[1:]): 
    print current_line 
    print next_line 
    print '-------' 
은 기본적으로 위의 코드는 모든 라인을 읽고 현재의 라인과 다음을 포함 튜플의 목록을 만들 수 zip를 사용

하나. 이 경우

import itertools 
f = open('somefile.txt') 
i1, i2 = itertools.tee(f) 
lines = itertools.izip(i1, itertools.islice(i2, 1, None)) 
for current_line, next_line in lines: 
    print current_line 
    print next_line 
    print '-------' 

을 :

편집 : 다음과 같이 다른 방법으로, 긴 파일의 경우 itertools 라이브러리를 사용할 수 있습니다

  • itertools.tee는 (현재 하나를 두 indenpendent 반복자를 만드는 데 사용됩니다 원본 파일 반복자를 사용하는 행과 줄을 하나씩).
  • itertools.slice은 두 번째 줄에서 다음 줄 반복자를 시작하는 데 사용됩니다.
  • itertools.izip은 두 반복기의 결과를 튜플에서 한 줄씩 조인하는 데 사용됩니다.

편집 2 : 어떤 값을 사용하여, 나의 이해가 맞으면

import itertools 
f = open('somefile.txt') 
g = open('somefile.txt') 
lines = itertools.izip(f, itertools.islice(g, 1, None)) 
for current_line, next_line in lines: 
    print current_line 
    print next_line 
    print '-------' 
+1

** tee() **를 사용할 필요가 없습니다. 다른 파일 핸들러 인''g = open ('somefile.txt')''을 정의하고''g.readline()' '을 사용하여 한 줄 앞으로 이동하십시오. 그런 다음''lines = ((f.readline(), line) in g)'' – eyquem

+0

@eyquem 귀하의 의견을 보내 주셔서 감사합니다. 귀하의 의견을 포함하도록 답변을 편집했습니다. – jcollado

0
with open('somefile.txt') as f, open('somefile.txt') as g: 
    g.readline() 
    lines = ((f.readline(),line) for line in g) 
     for precline,aheadline in lines: 
      # do what you want 
관련 문제