Python gera um erro IO enquanto se intercalam abrir / fechar / readline / gravação no mesmo arquivo
-
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!
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)