为什么我的脚本不会写入文件?

时间:2011-02-13 19:50:19

标签: python linux file unix

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 个答案:

答案 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

相关问题