<p>首先要了解的是,当您执行textFile.write时,无法确定会立即写入文件。这是为了提高写入效率,首先将数据放入缓冲区,只有当文件已满、调用flush或文件关闭(内部执行flush)时,缓冲区才会写入文件</p>
<p>(从技术上讲,flush不足以确保将数据写入文件,请参见<a href="https://docs.python.org/3/library/io.html#io.IOBase.flush" rel="nofollow noreferrer">os.fsync</a>)</p>
<p>因此,原因是不能使用两个不同的变量名称,因为写入操作从未真正发生在<code>textFile_1.close()</code>行之前</p>
<p>它使用相同的变量名“工作”的原因是,当您重新绑定<code>textFile = open(filename)</code>时,以前绑定到<code>textFile</code>的文件现在不在任何地方引用,因此垃圾收集器将其删除。当文件句柄被删除时,数据将写入文件,因此您可以在以后读取它</p>
<p>另外,在处理文件时,应该使用with open习惯用法:<a href="https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files" rel="nofollow noreferrer">link</a></p>
<p>请参见下文,FileDebug包装器将显示文件何时被删除,以及数据何时被写入</p>
<pre class="lang-py prettyprint-override"><code>class FileDebug:
def __init__(self, f, name):
self.f = f
self.name = name
def close(self):
print(f"Closing file (var: {self.name})")
self.f.close()
def write(self, *args, **kwargs):
self.f.write(*args, **kwargs)
def read(self, *args, **kwargs):
return self.f.read(*args, **kwargs)
def __del__(self):
print(f"Del completed (var: {self.name})")
filename = "text.txt"
def different_name():
textCont = "Hello World"
print("Original content of the file")
print(FileDebug(open(filename), "No name").read())
textFile = FileDebug(open(filename, "w"), "textFile")
textFile.write(textCont)
print("New file content:")
textFile_1 = FileDebug(open(filename), "textFile_1")
print(textFile_1.read())
textFile.close()
textFile_1.close()
def same_name():
textCont = "Hello World"
print("Original content of the file")
print(FileDebug(open(filename), "No name").read())
textFile = FileDebug(open(filename, "w"), "textFile")
textFile.write(textCont)
print("New file content:")
textFile = FileDebug(open(filename), "textFile")
print(textFile.read())
textFile.close()
different_name()
"""
Original content of the file
Del completed (var: No name)
New file content:
Closing file (var: textFile)
Closing file (var: textFile_1)
Del completed (var: textFile)
Del completed (var: textFile_1)
"""
#same_name()
"""
Original content of the file
Del completed (var: No name)
New file content:
Del completed (var: textFile) # the file is closed and the data is written
Hello World
Closing file (var: textFile)
Del completed (var: textFile)
"""
</code></pre>