Python 3。文件状态为打开或关闭

Python 3。文件状态为打开或关闭,python,Python,开始学习Python!终于 所涉行: readMyFile=open("myFile.txt","r").read() 上面的行将txt文件读入变量readMyFile。我需要知道的是: 如何获取myFile.txt文件的状态(如果打开或关闭)?如果它是打开的,如何关闭它?我知道如何关闭它,以防发生以下情况: readMyFile=open("myFile.txt","r") readMyFile.close 但在上述情况下,变量包含来自文件的文本,而不是文件对象 提前谢谢 写这篇文章时:

开始学习Python!终于

所涉行:

readMyFile=open("myFile.txt","r").read()
上面的行将txt文件读入变量readMyFile。我需要知道的是:

如何获取myFile.txt文件的状态(如果打开或关闭)?如果它是打开的,如何关闭它?我知道如何关闭它,以防发生以下情况:

readMyFile=open("myFile.txt","r")
readMyFile.close
但在上述情况下,变量包含来自文件的文本,而不是文件对象

提前谢谢

写这篇文章时:

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”解决方案,在这两种情况下,文件都将被关闭并丢弃

不,它们不是等价物

  • 第一个版本丢弃了对file对象的引用,因此该文件现在是垃圾文件,但是您要让Python来确定它是垃圾文件,并在它发现并找到它时为您清理它(关闭该文件)

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

碰巧,在这个特定的示例中,使用CPython(如果您不知道使用的是哪一个,则可能使用的Python实现),Python将发现该值是垃圾,并在语句末尾关闭该文件,因此没有区别

但在稍有不同的情况下并非如此。如果你不知道一点CPython的工作原理,你就不可能真正知道它在哪种情况下是正确的。即使这样,如果您在PyPy而不是CPython中运行相同的代码,它也会做一些不同的事情。这就是为什么许多Python程序有时会神秘地写不出文本文件的最后300字节,或者Python web服务器有时会因为文件句柄不足而失败,依此类推,这正是
with
语句所解决的问题:通过一个简单的缩进告诉Python您需要值生存多久,并且它确保值在最后被清除。

当您编写此语句时:

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”解决方案,在这两种情况下,文件都将被关闭并丢弃

不,它们不是等价物

  • 第一个版本丢弃了对file对象的引用,因此该文件现在是垃圾文件,但是您要让Python来确定它是垃圾文件,并在它发现并找到它时为您清理它(关闭该文件)

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

碰巧,在这个特定的示例中,使用CPython(如果您不知道使用的是哪一个,则可能使用的Python实现),Python将发现该值是垃圾,并在语句末尾关闭该文件,因此没有区别

但在稍有不同的情况下并非如此。如果你不知道一点CPython的工作原理,你就不可能真正知道它在哪种情况下是正确的。即使这样,如果您在PyPy而不是CPython中运行相同的代码,它也会做一些不同的事情。这就是为什么许多Python程序有时会神秘地写不出文本文件的最后300字节,或者Python web服务器有时会因为文件句柄不足而失败,依此类推,这正是
with
语句所解决的问题:只需一个简单的缩进,您就可以告诉Python您需要值生存多长时间,并且它确保值在最后被清除。

尝试:

with open("myFile.txt","r") as fd:
     readMyFile = fd.read()
在这里,您无需担心关闭文件。有时,打开过多文件而不关闭可能会导致一些问题。使用with语句Python将在with块后自动关闭文件

试试看:

with open("myFile.txt","r") as fd:
     readMyFile = fd.read()
在这里,您无需担心关闭文件。有时打开和删除的文件太多