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

StackOverflow https://stackoverflow.com/questions/872680

  •  22-08-2019
  •  | 
  •  

Вопрос

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

Спасибо!

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

Могу ли я добавить вопрос?Некоторое время меня озадачивало следующее.Я всегда получаю ошибку 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top