Python在同一文件上交错打开/关闭/读取/写入时生成IO错误

Python在同一文件上交错打开/关闭/读取/写入时生成IO错误,python,python-3.x,Python,Python 3.x,我正在学习Python,这给了我一个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 = cur

我正在学习Python,这给了我一个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()

谢谢

仅当满足if条件时才关闭文件,否则在if块后尝试重新打开文件。根据您想要实现的结果,您将想要删除f.close调用,或者添加一个ELSE分支并删除第二个f.open调用。无论如何,我要警告您,IF块中的str(now)已被弃用,因为您没有将调用的结果保存到任何位置。

仅当IF条件满足时才关闭文件,否则在IF块后尝试重新打开它。根据您想要实现的结果,您将想要删除f.close调用,或者添加一个ELSE分支并删除第二个f.open调用。无论如何,我要警告您,IF块中的str(现在)已被弃用,因为您没有将调用的结果保存到任何地方。

嗯,有几件事

在while循环之外打开(money.txt)
,但在第一次迭代后关闭它。。。 (从技术上讲,您可以关闭,重新打开并再次关闭)


当循环第二次循环时,
f
将被关闭,f.readLine()很可能会失败

在while循环之外打开(money.txt)
,但在第一次迭代后关闭它。。。 (从技术上讲,您可以关闭,重新打开并再次关闭)


Put当循环第二次循环时,
f
将关闭,f.readLine()很可能会失败而True将永远循环,除非您使用
break
将其中断


I/O错误可能是因为当您运行循环一次后,最后要做的事情是
f.close()
,这将关闭文件。当执行继续时,循环行
currentmoney=float(f.readline())
f
将是一个无法读取的闭合文件句柄。

而True
将永远循环,除非您使用
break
将其断开


I/O错误可能是因为当您运行循环一次后,最后要做的事情是
f.close()
,这将关闭文件。当执行继续时,循环在
currentmoney=float(f.readline())行中
f
将是一个封闭的文件句柄,您无法读取。

如果money.txt不存在,您的第一行将出现IO错误。

如果money.txt不存在,您的第一行将出现IO错误。

我可以背一个问题吗?以下几点让我困惑了一段时间。我总是从这些“open()”语句中得到一个IOError,因此我已停止检查错误。(不喜欢这样做!)我的代码有什么问题?注释中显示的“if IOError:”测试最初正好位于带有“open()”的语句之后


我能背一个问题吗?以下几点让我困惑了一段时间。我总是从这些“open()”语句中得到一个IOError,因此我已停止检查错误。(不喜欢这样做!)我的代码有什么问题?注释中显示的“if IOError:”测试最初正好位于带有“open()”的语句之后


在哪一行出现错误…添加播撒在解释器中的错误消息在堆栈溢出时是否应鼓励此类问题?这不是一个有同样问题的人能够找到的问题。如果有大量的人问这样的问题,我们最终会有大量的“这个代码怎么了?”问题。维吉尔:这样的问题很好。我们确实收到了很多关于这个代码的问题。这是网站的一部分。有很多这样的问题,但如果它有一个更好的标题还是不错的。。。我会解决的。顺便说一下,这看起来像Python 3?如果是这样,您可能希望添加“python3.0”标记。错误在哪一行…添加播撒在解释器中的错误消息在堆栈溢出时是否鼓励此类问题?这不是一个有同样问题的人能够找到的问题。如果有大量的人问这样的问题,我们最终会有大量的“这个代码怎么了?”问题。维吉尔:这样的问题很好。我们确实收到了很多关于这个代码的问题。这是网站的一部分。有很多这样的问题,但如果它有一个更好的标题还是不错的。。。我会解决的。顺便说一下,这看起来像Python 3?如果是这样,您可能希望添加“python3.0”标记。IOError是一个例外。您不使用“if”检查异常,而是使用try。。。。除了IOError。IOError本身,就像0以外的任何值一样,False和空列表,计算结果为True。你知道,我在键入时对自己说,“我想知道我是否曾经尝试过‘尝试……除了……’。谢谢你给出了清晰、准确、完整和准确的答案。更不用说几乎是即时的!这是一个非常好的网站。请不要“背负”“问题。问一个单独的,易于搜索的,离散的问题,这样它就可以有一个易于搜索的离散答案集。请随意删除此非答案并提出适当的问题。IOError是一个例外。您不使用“if”检查异常,而是使用try。。。。除了IOError。IOError本身,就像0以外的任何值一样,False和空列表,计算结果为True。你知道,我在键入时对自己说,“我想知道我是否曾经尝试过‘尝试……除了……’。谢谢你给出了清晰、准确、完整和准确的答案。更不用说几乎是即时的!这是一个非常好的网站。请不要“背负”“问题。问一个单独的,易于搜索的,离散的问题,这样它就可以有一个易于搜索的离散答案集。请随意删除此非答案并提出适当的问题。
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)