Python的open()会读取未刷新缓存吗?

2 投票
4 回答
924 浏览
提问于 2025-04-17 04:17

我对文件缓冲区是怎么工作的了解不太深,所以请原谅我这个问题有点简单。我有一段Python代码,它会等待一个文件出现,然后读取这个文件。

while 1:
    try:
        f = open('file.txt')
        f.close()
        print "Message received."
        break
    except:
        time.sleep(0.3)

这里的file.txt是另一个程序写的文件。不过,我有个疑问,Python是不是在文件file.txt还没完全写完的时候就开始读取了,也就是说在我调用close()之前就已经关闭了文件句柄。这种情况可能发生吗?

如果真是这样,有没有办法让我在上面的读取程序中检测到缓冲区是否已经被刷新,也就是在我调用f.close()之前?

4 个回答

1

Python不会阻止你去读取一个还没有写完的文件。

如果我在等另一个程序写的文件,我通常会让那个程序先写一个不同名字的文件。等那个程序写完后,它会关闭文件并把文件名改成我期待的那个名字。这样我就不会读到一个没写完的文件。

1

要检查一个文件是否存在,可以使用 os.path.exists,或者如果你想确认它是一个“常规”文件,可以用 os.path.isfile

在Unix系统中,当你打开一个文件进行写入或追加内容时,会创建一个目录条目。但是,实际上写入到文件中的内容在读者看来是看不到的,直到这些内容被刷新到文件中。通常没有办法去询问一个文件是否有“待处理”的输入输出操作;至少在Unix系统上是这样。

3

不要用while-loop来做这个事情。其实有更好的方法,不过具体的做法要看你用的是什么操作系统。

在Linux系统上,有个叫做inotify的工具。你可以写一个简单的pyinotify脚本来监控某个文件夹,并对IN_CLOSE_WRITE事件做出反应(这个事件只会在文件关闭后发生)。

在OSX系统上,有类似的功能叫做FSEvents,而Windows也有类似的工具。

撰写回答