Python的open()是否读取了未刷新的缓冲区?

时间:2011-10-13 21:32:34

标签: python file-io buffer

我对文件缓冲区如何工作的了解相当薄弱,所以请原谅这个问题的简单态度。我在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 个答案:

答案 0 :(得分:3)

请勿将while-loop用于此目的。有一种更好的方法,但细节取决于您的操作系统。

Linux有inotify。您可以编写一个简单的pyinotify脚本来查看目录并对IN_CLOSE_WRITE事件做出反应(仅在文件关闭后才会出现)。

OSX(FSEvents)和Windows具有类似的功能。

答案 1 :(得分:1)

Python不会阻止您阅读另一个进程尚未完成编写的文件。

如果我正在等待来自其他进程的文件,我通常会将该进程写入不同的文件名。一旦该过程完成写入,它就会关闭并将文件重命名为我期待的文件名。这样我就不会得到部分文件。

答案 2 :(得分:1)

要检查文件是否存在,请使用os.path.existsos.path.isfile,如果您需要它是“常规”文件。

在Unix上,打开文件进行写入/追加时,将创建一个目录条目。但是,写入文件的字节实际上不会显示在那里(从读者的角度来看),直到刷新I / O.没有正常的方法来询问文件中是否存在“待处理”I / O;至少不在Unix上。

答案 3 :(得分:0)

一般情况下,Linux没有任何问题,一个进程打开一个文件进行读取,而另一个进程打开它进行写入。考虑像tail -f $SOME_FILE这样的事情来实时跟踪文件的更新;如果尝试打开文件进行读取,则无法工作,必须阻止并等待编写器关闭文件。