【问题标题】: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(),所以你的文件中会写一些东西。

      【讨论】:

        【解决方案4】:

        阅读wheaties发布的答案。

        而且,如果您想强制将文件的缓冲区写入磁盘,请阅读: http://docs.python.org/library/stdtypes.html#file.flush

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-01
          相关资源
          最近更新 更多