开始学习Python!最后!
有问题的台词:
readMyFile=open("myFile.txt","r").read()
上面的行将 txt 文件读取到变量 readMyFile 中。我需要知道的:
如何获取 myFile.txt 文件的状态(如果它是打开的还是关闭的(?如果它打开了,如何关闭它?我知道如何关闭它,以防万一:
readMyFile=open("myFile.txt","r")
readMyFile.close
但在上面的情况下,变量包含来自文件的文本,而不是文件对象。
提前感谢!
当你写这个的时候:
readMyFile=open("myFile.txt","r").read()
。您无法获取文件的状态、关闭文件或其他任何内容。您没有存储它,因此无法访问它。没有魔法可以让你拿回你扔掉的信息(否则,扔掉信息是没有意义的,垃圾收集之类的东西不可能奏效(。
解决方案就是不这样做:任何你想使用的值,把它存储在一个变量中(或者一个列表或字典成员,或者一个实例的属性,或者其他什么——只是把它存储在某个地方(,然后(正如你已经从你的问题中知道的那样(你可以使用它:
>>> 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 服务器偶尔会因文件句柄耗尽而失败,等等——这正是with
语句解决的问题:你告诉 Python 你需要值存在多长时间,只需一个简单的缩进, 它确保最终清理该值。
尝试:
with open("myFile.txt","r") as fd:
readMyFile = fd.read()
在这里,您无需担心关闭文件。有时打开的文件过多而不关闭可能会导致一些问题。使用 with 语句 Python 将在 with block 后自动关闭您的文件。