Python 3.文件状态打开或关闭

时间:2018-07-05 07:21:22

标签: python

开始学习Python!终于!

相关行:

readMyFile=open("myFile.txt","r").read()

上面的行将txt文件读入变量readMyFile。我需要知道的:

如何获取myFile.txt文件的状态(如果文件处于打开或关闭状态)?以及如何将其关闭(如果打开)?我知道如何关闭它,以防万一:

readMyFile=open("myFile.txt","r")
readMyFile.close

但在上述情况下,变量包含文件中的文本,而不是文件对象。

谢谢!

2 个答案:

答案 0 :(得分:2)

当您写这篇文章时:

readMyFile=open("myFile.txt","r").read()

...您无法获取文件的状态,关闭文件或进行其他操作。您没有存储它,因此无法访问它。没有任何魔术可以让您取回被抛弃的信息(否则,抛弃信息将毫无意义,垃圾收集之类的东西将无法工作)。

解决方案是不这样做:将要使用的任何值存储在变量(或列表或dict成员,或实例的属性,等等)中,只需将其存储在 ),然后(您已经从问题中知道了)可以使用它:

>>> myfile = open("myFile.txt","r")
>>> readMyFile = myFile.read()
>>> myFile.closed
False
>>> myFile.close()
>>> myFile.closed
True

尽管在这种情况下,还有一个更好的答案:

>>> 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()等于'with'解决方案,在两种情况下文件都将被关闭并丢弃?

不,它们不是等效的。

  • 第一个版本会丢弃对文件对象的引用,因此该文件现在是垃圾文件-但您将其留给Python来确定它是垃圾文件并清理(这将关闭文件)随时随地为您服务。

  • with版本告诉Python在with语句完成后立即进行清理。

碰巧的是,在这个特定示例中,使用CPython(如果您不知道使用的是哪个Python实现),Python会发现该值是垃圾,然后关闭文件,在语句的末尾,所以没有区别。

但是在稍微不同的情况下并非如此。在不了解CPython工作原理的内部的情况下,您实际上无法知道在哪种情况下是正确的。即使在这种情况下,如果您在PyPy而不是CPython中运行相同的代码,它也会执行不同的操作。这就是为什么许多过去神秘地使用Python程序有时无法写入文本文件的最后300个字节的原因,或者Python Web服务器有时会因文件句柄用尽而失败,依此类推-正是{{1} }语句解决了:您通过简单的缩进告诉Python您需要多长时间才能保留该值,并确保最后清除该值。

答案 1 :(得分:1)

尝试:

with open("myFile.txt","r") as fd:
     readMyFile = fd.read()

这里您不必担心关闭文件。有时,打开过多且未关闭的文件会导致某些问题。使用with语句Python将在with块之后自动关闭文件。