Python gera um erro IO enquanto se intercalam abrir / fechar / readline / gravação no mesmo arquivo

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

  •  22-08-2019
  •  | 
  •  

Pergunta

Eu estou aprendendo Python-isso me dá um erro IO -

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()

Obrigado!

Foi útil?

Solução

O while True vai fazer um loop para sempre a menos que você quebrá-lo com break.

O erro de I / O é provavelmente porque quando você ter executado através do loop uma vez que a última coisa que você faz é f.close(), que fecha o arquivo. Quando a execução continua com o laço na currentmoney = float(f.readline()) linha:. f será um filehandle fechado que você não pode ler

Outras dicas

também há um par de coisas ...

Você open(money.txt) fora do loop while, mas você fechá-lo após a primeira iteração ... (Tecnicamente você fechar, reabrir e fechar de novo)

put quando o laço vem rodada pela segunda vez, f será fechada e f.readline () provavelmente irá falhar

Você fechar o arquivo somente se a condição IF está satisfeito, caso contrário você tentar reabri-lo após o IF bloco. Dependendo do resultado que você deseja alcançar, você vai querer remover quer a chamada f.close, ou adicionar um ramo ELSE e remover a segunda chamada f.open. De qualquer forma, deixe-me avisá-lo que o str (agora) em seu bloco de IF é apenas obsoleta como você não está salvando o resultado de que qualquer chamada.

Você obterá um erro IO em sua primeira linha se money.txt não existe.

Posso pegar carona uma pergunta? A seguir tem me intrigado por algum tempo. Eu sempre obter um IOError de tais declarações 'open ()', então eu parei de verificação para o erro. (Não gosto de fazer isso!) O que há de errado com o meu código? O 'se IOError:' test mostrado nos comentários foi originalmente logo após a declaração com '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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top