Почему мой сценарий не записывает в файл? - PullRequest
2 голосов
/ 13 февраля 2011
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 ]

7 голосов
/ 13 февраля 2011

Вы никогда не можете выйти из цикла while, следовательно, вызов f.close() никогда не будет вызываться, и буфер потока в файл никогда не будет сброшен.

Позвольте мне объяснить немного подробнее, за исключениемоператор catch, который вы включили continue, поэтому нет "выхода" в условие цикла.Возможно, вам следует добавить какой-то индикатор того, что вы достигли конца страницы, вместо статического 1.Затем вы увидите вызов close и информацию, напечатанную в файле.

3 голосов
/ 13 февраля 2011

Голое разве что почти наверняка плохая идея;Вы должны обрабатывать только то исключение, которое ожидаете увидеть.Тогда, если он сделает что-то совершенно неожиданное, вы все равно получите полезную трассировку об этом.

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» гарантирует, что журналфайл закрыт правильно.

1 голос
/ 13 февраля 2011

Прочитайте ответ, опубликованный wheaties.

И, если вы хотите принудительно записать буфер файла на диск, прочитайте: http://docs.python.org/library/stdtypes.html#file.flush

1 голос
/ 13 февраля 2011

Из того, что я понимаю, вы хотите выводить случайное число каждые три секунды в файл. Но кэширование будет иметь место, поэтому вы не увидите свои цифры, пока кеш не станет слишком большим, обычно порядка 4 Кбайт.

Я предлагаю, чтобы в вашем цикле вы добавили f.flush () перед строкой sleep ().

Кроме того, подобно wheaties sugessted, у вас должна быть надлежащая обработка исключений (если я хочу остановить вашу программу, я, скорее всего, сделаю SIGINT, используя Ctrl + C, и ваша программа не остановится в этом случае) и правильный выход путь.

Я уверен, что когда вы тестируете свою программу, вы сильно ее убьете, чтобы остановить, и любое записанное случайное число не будет записано, потому что файл не закрыт должным образом. Если ваша программа может нормально завершиться, у вас будет close () d файл, а close () запускает flush (), и в вашем файле будет что-то записано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...