当你写这篇文章时:readMyFile=open("myFile.txt","r").read()
…您无法获取文件的状态,或将其关闭,或其他任何操作。你没有存储它,所以你无法访问它。没有什么魔力可以让你找回你丢弃的信息(否则,扔掉信息就没有意义了,垃圾回收之类的东西也不可能起作用)。在
解决方法是不要这样做:任何你想使用的值,把它存储在变量(或者一个列表或dict成员,或者一个实例的属性,或者任何只将它存储在某个地方的东西),然后(正如你从问题中已经知道的那样),你可以使用它:
^{pr2}$
尽管在这种情况下,还有一个更好的答案:>>> with open("myFile.txt", "r") as myFile:
... readMyFile = myFile.read()
现在,myFile在with语句的末尾自动关闭,因此您不必担心它。在
或者,更好的是,您可以将其包装在一个函数中:>>> def readfile(name):
... with open(name) as myFile:
... return myFile.read()
>>> readMyFile = readfile("myFile.txt")
…而且除了readfile中的两行代码外,没有任何代码需要考虑文件对象。在
在一篇评论中,你问:readMyFile=open("myFile.txt","r").read() is equal to 'with' solution in regard, that in both cases file will be closed and throwed away?
不,它们不是等价的。在第一个版本放弃了对file对象的引用,因此文件现在是垃圾文件,但是您将它留给Python来确定它是垃圾,并在它发现并找到它时为您清理(关闭文件)。
with版本告诉Python在with语句完成后立即清理。
碰巧,在这个特定的例子中,对于CPython(如果您不知道使用的是哪一个,您可能正在使用的Python实现),Python会发现该值是垃圾,并在语句末尾关闭该文件,因此没有区别。在
但在稍有不同的情况下,情况并非如此。如果不了解CPython是如何工作的,就无法真正知道在哪些情况下是正确的。即使这样,如果你在PyPy而不是CPython中运行相同的代码,它也会做一些不同的事情。这就是为什么许多Python程序过去常常神秘地有时无法写入文本文件的最后300个字节,或者Python web服务器偶尔会因为文件句柄用完而失败,等等,这正是with语句解决的问题:您只需简单的缩进就可以告诉Python您需要值生存多久,然后它就可以了确保值在末尾被清除。在