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字节。
答案 0 :(得分:7)
你永远不能离开while循环,因此永远不会调用f.close()
调用,永远不会刷新文件的流缓冲区。
让我再解释一下,在您的异常catch语句中,您已经包含continue
,因此循环条件没有“退出”。也许您应该添加某种指标,表明您已到达页面末尾而不是静态1
。然后,您会看到close
调用和信息打印到文件中。
答案 1 :(得分: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”子句将确保正确关闭日志文件。
答案 2 :(得分:1)
据我所知,您希望每三秒将一个随机数输出到一个文件中。但是缓存会发生,所以在缓存增长得太大之前你不会看到你的数字,通常是4K字节的顺序。
我建议你在循环中,在sleep()行之前添加一个f.flush()。
此外,像小麦一样,你应该有适当的异常处理(如果我想停止你的程序,我可能会使用Ctrl + C进行SIGINT,你的程序在这种情况下不会停止)并且正确退出路径。
我确信当你测试你的程序时,你会很难停止它,并且它写的任何随机数都不会写,因为文件没有正确关闭。如果你的程序可以正常退出,你可能会关闭()d文件,而close()会触发flush(),所以你会在文件中写入一些内容。
答案 3 :(得分:1)
阅读wheaties发布的答案。
并且,如果要强制将文件的缓冲区写入磁盘,请阅读: http://docs.python.org/library/stdtypes.html#file.flush