2011-02-13 2 views
2
import time 
import traceback 
import sys 
import tools 
from BeautifulSoup import BeautifulSoup 

f = open("randomwords.txt","w") 
while 1: 
    try: 
     page = tools.download("http://wordnik.com/random") 
     soup = BeautifulSoup(page) 
     si = soup.find("h1") 
     w = si.string 
     print w 
     f.write(w) 
     f.write("\n") 
     time.sleep(3) 
    except: 
     traceback.print_exc() 
     continue 


f.close() 

잘 인쇄됩니다. 파일에 쓰지 않습니다. 0 바이트입니다.내 스크립트가 파일에 쓰지 않는 이유는 무엇입니까?

+4

['제외 :'악 (http://docs.python.org/howto/doanddont. html # except). 정당한 사유와 이유를 설명하는 의견이없는 한 예외를 삼킨다. 그리고 * 실제 * 무한 루프 ('중단'또는 탈주 예외가없는 종류)는 ... 음, 문제입니다.) – delnan

답변

7

while 루프를 벗어날 수 없으므로 f.close() 호출이 절대 호출되지 않으며 파일에 대한 스트림 버퍼가 절대 플러시되지 않습니다.

조금 더 설명해 드리겠습니다. 예외 상황 파악 문에 continue을 포함 시켰으므로 루프 조건에 "종료"가 없습니다. 아마도 고정 된 1 대신에 페이지 끝 부분에 도달했음을 나타내는 지표를 추가해야 할 것입니다. 그런 다음 close 호출 및 정보가 파일에 인쇄 된 것을 볼 수 있습니다.

1

필자가 생각하기에, 매 3 초마다 임의의 숫자를 하나의 파일에 출력하려고합니다. 그러나 캐싱이 발생하므로 캐쉬가 너무 커질 때까지 (보통 4K 바이트의 순서로) 숫자가 표시되지 않습니다.

나는 루프에 sleep() 줄 앞에 f.flush()를 추가하는 것이 좋습니다.

또한 wheatsies sugessted처럼 적절한 예외 처리가 있어야합니다 (프로그램을 중지하려면 Ctrl + C를 사용하여 SIGINT를 수행하고이 경우 프로그램이 중단되지 않음) 적절한 출구 경로.

프로그램을 테스트 할 때 프로그램을 중단하기가 어렵지 만 파일을 제대로 닫지 않아서 작성한 임의의 난수는 쓰여지지 않습니다. 프로그램을 정상적으로 종료 할 수 있으면 close() d 파일을 사용하고 close()는 flush()를 트리거하므로 파일에 내용이 기록됩니다.

3

제외는 거의 확실한 것은 아닙니다. 당신은 당신이보기를 기대하는 예외만을 처리해야한다. 그렇다면 그것이 예상치 못한 일을한다면 여전히 유용한 오류 추적을 얻을 것입니다.

import time 
import tools 
from BeautifulSoup import BeautifulSoup 

def scan_file(url, logf): 
    try: 
     page = tools.download(url) 
    except IOError: 
     print("Couldn't read url {0}".format(url)) 
     return 

    try: 
     soup = BeautifulSoup(page) 
     w = soup.find("h1").string 
    except AttributeError: 
     print("Couldn't find <h1> tag") 
     return 

    print(w) 
    logf.write(w) 
    logf.write('\n') 

def main(): 
    with open("randomwords.txt","a") as logf: 
     try: 
      while True: 
       time.sleep(3) 
       scan_file("http://wordnik.com/random", logf) 
     except KeyboardInterrupt: 
      break 

if __name__=="__main__": 
    main() 

이제 Ctrl-C를 입력하여 프로그램을 종료 할 수 있으며 "을"절은 로그 파일이 제대로 닫혀 있는지 확인합니다.

관련 문제