Python генерирует ошибку ввода-вывода при чередовании open / close / readline / write в одном файле - PullRequest
1 голос
/ 16 мая 2009

Я изучаю Python - это выдает ошибку ввода-вывода -

f = open('money.txt')
while True:
    currentmoney = float(f.readline())
    print(currentmoney, end='')
    if currentmoney >= 0:
        howmuch = (float(input('How much did you put in or take out?:')))

        now = currentmoney + howmuch
        print(now)
        str(now)
        f.close()
    f = open('money.txt', 'w')
    f.write(str(now))
    f.close()

Спасибо! * * 1004

Ответы [ 5 ]

3 голосов
/ 16 мая 2009

while True будет зацикливаться вечно, если вы не разорвете его с помощью break.

Ошибка ввода-вывода, вероятно, связана с тем, что, когда вы один раз выполнили цикл, последнее, что вы делаете, это f.close(), который закрывает файл. Когда выполнение продолжается с циклом в строке currentmoney = float(f.readline()): f будет закрытым дескриптором файла, из которого вы не сможете прочитать.

2 голосов
/ 16 мая 2009

ну, есть пара вещей ...

вы open(money.txt) вне цикла while, но закрываете его после первой итерации ... (технически вы закрываете, снова открываете и закрываете снова)

Устанавливается, когда цикл повторяется во второй раз, f будет закрыт и f.readLine (), скорее всего, завершится ошибкой

0 голосов
/ 16 мая 2009

Могу ли я прокрутить вопрос? Следующее озадачило меня на некоторое время. Я всегда получаю IOError из этих операторов 'open ()', поэтому я перестал проверять наличие ошибки. (Не люблю это делать!) Что не так с моим кодом? Тест 'if IOError:', показанный в комментариях, изначально был сразу после оператора с open ().

if __name__ == '__main__':
#get name of input file and open() infobj
    infname = sys.argv[1]
    print 'infname is:  %s' % (sys.argv[1])
    infobj = open( infname, 'rU' )
    print 'infobj is:  %s' % infobj
# 'if IOError:' always evals to True!?!
#   if IOError:
#       print 'IOError opening file tmp with mode rU.'
#       sys.exit( 1)

#get name of output file and open() outfobj
    outfname = sys.argv[2]
    print 'outfname is: %s' % (sys.argv[2])
    outfobj = open( outfname, 'w' )
    print 'outfobj is: %s' % outfobj
#   if IOError:
#       print 'IOError opening file otmp with mode w.'
#       sys.exit( 2)
0 голосов
/ 16 мая 2009

Вы получите ошибку ввода-вывода в первой строке, если money.txt не существует.

0 голосов
/ 16 мая 2009

Вы закрываете свой файл, только если условие IF выполнено, в противном случае вы пытаетесь открыть его после блока IF. В зависимости от того, какого результата вы хотите достичь, вы можете либо удалить вызов f.close, либо добавить ветку ELSE и удалить второй вызов f.open. В любом случае позвольте мне предупредить вас, что str (сейчас) в вашем блоке IF просто устарела, поскольку вы нигде не сохраняете результат этого вызова.

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