2011-02-13 55 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#除外)。除非有充分的理由和解释原因的评论,否则也会吞咽异常。而*真正的*无限循环(没有'break'或异常发生的类型)是......好,是一个问题;) – delnan 2011-02-13 19:57:12

回答

7

您永远不能离开while循环,因此将永远不会调用f.close()调用,并且永不刷新文件的流缓冲区。

让我进一步解释一下,在你包含continue的异常捕获语句中,所以没有“退出”循环条件。也许你应该添加一些指标,你已经达到了页面的结尾,而不是一个静态的1。然后你会看到close呼叫和打印到文件的信息。

1

据我所知,你想每三秒钟输出一个随机数到一个文件。但是缓存将会发生,所以直到缓存变得太大时,你才会看到你的数字,通常是4K字节。

我建议在你的循环中,在sleep()行之前添加一个f.flush()。你也应该有适当的异常处理(如果我想停止你的程序,我可能会用Ctrl + C做一个信号情报,并且你的程序不会停止在这种情况下)退出路径。

我敢肯定,当你测试你的程序时,你会杀死它很难停止它,并且它写入的任何随机数不会被写入,因为文件没有正确关闭。如果你的程序可以正常退出,你可以关闭()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关闭程序,“with”子句将确保日志文件正确关闭。

相关问题