Python генерирует ошибку ввода-вывода при чередовании открытия/закрытия/чтения/записи в одном и том же файле

Я изучаю 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()

Спасибо!


person James Wanchai    schedule 16.05.2009    source источник
comment
в какой строке ошибка....добавьте сообщение об ошибке, которое посеяно в интерпретаторе   -  person yesraaj    schedule 16.05.2009
comment
Следует ли поощрять такие вопросы в Stack Overflow? Это не тот вопрос, который сможет найти человек с такой же проблемой. Если бы большое количество людей задавало такие вопросы, мы бы получили тонны вопросов Что не так с этим кодом? вопросы. Есть ли у SO политика по этому поводу?   -  person Virgil Dupras    schedule 16.05.2009
comment
@Вирджил: Такой вопрос вполне подходит. Мы действительно получаем множество вопросов о том, что не так с этим кодом. Это часть сайта.   -  person Paolo Bergantino    schedule 16.05.2009
comment
Таких вопросов много, но было бы неплохо, если бы у него было лучшее название... Я это исправлю.   -  person ephemient    schedule 16.05.2009
comment
Кстати, это похоже на Python 3? Если это так, вы можете добавить тег python3.0.   -  person ephemient    schedule 16.05.2009
comment
@virgil Я думаю, что это прекрасный вопрос. SO — это не просто ресурс для задач General Solve X. Люди должны иметь возможность полагаться на сообщество, чтобы получить помощь в решении конкретных проблем.   -  person Eoin Campbell    schedule 16.05.2009
comment
Наличие кода — это БОЛЬШОЙ шаг вперед по сравнению с людьми, которые задают вопросы plzsendtehcodez там, где они просят код.   -  person S.Lott    schedule 17.05.2009


Ответы (5)


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

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

person monowerker    schedule 16.05.2009

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

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

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

person Eoin Campbell    schedule 16.05.2009

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

person em70    schedule 16.05.2009

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

person Sliff    schedule 16.05.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)
person behindthefall    schedule 16.05.2009
comment
IOError является исключением. Вы не проверяете исключения с помощью 'if', вы делаете это с помощью try.... кроме IOError. Сам IOError, как и любое другое значение, кроме 0, False и пустого списка, оценивается как True. - person Daniel Roseman; 16.05.2009
comment
Знаешь, сказал я себе, пока печатал это, интересно, пробовал ли я когда-нибудь «попробовать… кроме…». СПАСИБО за четкий, точный, полный и точный ответ. Не говоря уже о почти мгновенном! Это очень хороший сайт. - person behindthefall; 16.05.2009
comment
Пожалуйста, не дублируйте вопросы. Задайте отдельный, удобный для поиска дискретный вопрос, чтобы на него можно было легко найти дискретный набор ответов. Не стесняйтесь удалить этот неответ и задать правильный вопрос. - person S.Lott; 17.05.2009