开幕式&使用文件对象关闭文件:
fp=open("ram.txt","w")
fp.close()
如果我们想打开&关闭文件而不使用文件对象,即;
open("ram.txt","w")
我们需要写close("poem.txt")
还是写close()
没问题?
他们都没有提出任何错误......
只编写close(),它如何理解我们引用的文件?
答案 0 :(得分:9)
对于内存中的每个对象,Python保留引用计数。只要没有对周围对象的引用,它就会被垃圾收集。
open()
函数返回文件对象。
f = open("myfile.txt", "w")
在上面的行中,您在变量f
中保留对对象的引用,因此文件对象保持存在。如果你这样做
del f
然后文件对象不再有引用,并将被清除。它将在此过程中关闭,但这可能需要一段时间,这就是为什么最好使用with
构造。
但是,如果您这样做:
open("myfile.txt")
然后创建文件对象并立即再次丢弃,因为没有对它的引用。它消失了,关闭了。你不能关闭它,因为你无法说出你想要关闭的是什么。
open("myfile.txt", "r").readlines()
要评估整个表达式,首先调用open
,它返回一个文件对象,然后调用方法readlines
。然后返回结果。由于现在没有对文件对象的引用,它会立即再次丢弃。
答案 1 :(得分:3)
如果我正确理解了问题,我会使用with open(...)
。
这个答案可能对您What is the python keyword "with" used for?有帮助。
答案 2 :(得分:1)
回答你的实际问题......一个文件对象(当你调用open
时得到的内容)有对其中文件的引用。所以,当你做类似的事情时:
fp = open(myfile, 'w')
fp.write(...)
fp.close()
上述所有内容(包括write
和close
)都知道它们引用myfile
,因为这是与fp
相关联的文件。我不确定fp.close(myfile)
实际上做了什么,但它在打开后肯定不需要文件名。
像
这样的更好的结构with open(myfile,'w') as fp:
fp.write(...)
不要改变这个;在这种情况下,fp
也是一个上下文管理器,但仍包含指向myfile
的指针;没有必要提醒它。