【问题标题】:Why won't my script write to a file?为什么我的脚本不会写入文件?
【发布时间】:2011-02-13 19:50:18
【问题描述】:
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 字节。
【问题讨论】:
-
except: is evil。除非有充分的理由和 cmet 解释该原因,否则吞咽异常也是如此。并且 真正的 无限循环(没有break 或例外的那种)是……嗯,一个问题;)
标签:
python
linux
file
unix
【解决方案1】:
您永远不能离开 while 循环,因此永远不会调用 f.close() 并且永远不会刷新文件的流缓冲区。
让我进一步解释一下,在您的异常捕获语句中,您已包含 continue,因此循环条件没有“退出”。也许您应该添加某种已到达页面末尾的指示符,而不是静态的1。然后你会看到close 调用和打印到文件中的信息。
【解决方案2】:
几乎可以肯定,一个简单的 except 是一个坏主意;你应该只处理你期望看到的异常。然后,如果它做了一些完全出乎意料的事情,你仍然会得到一个有用的错误跟踪。
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”子句将确保日志文件正确关闭。
【解决方案3】:
据我了解,您希望每三秒将一个随机数输出到文件中。但是会进行缓存,因此在缓存变得太大(通常为 4K 字节左右)之前,您将看不到您的数字。
我建议在你的循环中,在 sleep() 行之前添加一个 f.flush()。
另外,就像 wheaties 所建议的那样,你应该有适当的异常处理(如果我想停止你的程序,我可能会使用 Ctrl+C 执行 SIGINT,并且在这种情况下你的程序不会停止)和正确的退出路径。
我敢肯定,当你测试你的程序时,你会很难阻止它,并且它写入的任何随机数都不会被写入,因为文件没有正确关闭。如果你的程序可以正常退出,你会close()d文件,close()会触发flush(),所以你的文件中会写一些东西。