2009-05-05 6 views
21

다른 프로그램에서 오류를 기록하고 오류가 발생하면 중단되었던 곳에서 프로그램을 다시 시작하는 스크립트를 작성하고 있습니다. 어떤 이유로 든이 프로그램의 개발자는 기본적으로 프로그램에이 기능을 넣을 필요가 없다고 생각했습니다.파일과 루프 섞기

어쨌든 프로그램은 입력 파일을 받아 구문 분석하고 출력 파일을 만듭니다. 입력 파일이 특정 형식에 :

UI - 26474845 
TI - the title (can be any number of lines) 
AB - the abstract (can also be any number of lines) 

프로그램에서 오류가 발생하면, 그것은 당신에게 당신이 오류를 추적하는 데 필요한 참조 정보를 제공합니다 - 즉, UI, 섹션 (제목 또는 추상), 및 제목 또는 초록의 시작 부분을 기준으로 한 줄 번호. 나는 참조 번호와 파일을 가져 와서 문장을 찾아서 기록하는 함수로 입력 파일에서 불쾌감을주는 문장을 기록하고 싶다. 내가 그것을 할 수있는 최선의 방법은 특정 시간 (즉, n 번, n은 seciton의 시작에 상대적인 라인 번호) 파일을 통해 앞으로 이동하는 것입니다.

i = 1 
while i <= lineNumber: 
    print original.readline() 
    i += 1 

나는이 날 데이터를 잃게 만들 것이라고 표시되지 않습니다,하지만 파이썬은 것 생각하고, ValueError: Mixing iteration and read methods would lose data을 말한다 :이 작업을 수행하는 의미를 보였다 방법입니다. 아무도 이것을 제대로하는 방법을 알고 있습니까?

+1

-1 : 코드 스 니펫에 없습니다. 표시된 코드에서 누락 된 것이 "원래의 것"입니다. –

답변

44

original.readline() 외에도 코드가 for line in original: 일 수 있으므로 ValueError가 발생합니다. 더 많은 메모리를 느린 프로그램을하지 않고 문제를 해결하거나 소비하기 쉬운 솔루션을 사용하면 하나 개의 라인을 필요로 가정

while True: 
    line = original.readline() 
    if not line: break 
    ... 
+1

당신은 머리에 못을 박 았어요. 이것은 가장 빠른 해결책이었습니다. 감사합니다. 그리고 다른 사람들의 반응에도 감사드립니다. –

+0

도 도움이되었습니다. 고맙습니다. – nish

+0

이것은 작동하지 않습니다. 그것은 무한 루프에 빠지게됩니다. 나는 eof가 None 값을 반환하지 않는다고 생각한다. – lionel319

10

forenumerate을 사용하십시오.

예 :

for line_num, line in enumerate(file): 
    if line_num < cut_off: 
     print line 

참고 : 당신은 더 많은 기능 맛을 선호하는 경우에 이미 등 또한

파일 핸들을 청소하는 가정은 takewhile 기능은 유용 할 수 있습니다.

0

for line in original: 
    ... 

을 변화시키고,이 도움이 될 수

import itertools 

def getline(fobj, line_no): 
    "Return a (1-based) line from a file object" 
    return itertools.islice(fobj, line_no-1, line_no).next() # 1-based! 

>>> print getline(open("/etc/passwd", "r"), 4) 
'adm:x:3:4:adm:/var/adm:/bin/false\n' 

파일에 줄이 적은 경우 StopIteration 오류를 catch 할 수 있습니다.

0

다음은 추한 while True 패턴없이 다른 모듈이없는 버전입니다 :

for line in iter(original.readline, ''): 
    if …: # to the beginning of the title or abstract 
     for i in range(lineNumber): 
      print original.readline(), 
     break