【问题标题】:Does Python's open() read an unflushed buffer?Python 的 open() 是否读取未刷新的缓冲区?
【发布时间】:2011-10-13 21:32:34
【问题描述】:

我对文件缓冲区如何工作的知识相当薄弱,所以请原谅这个问题的简单性。我在 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()之前检测(在上面列出的读取程序中)缓冲区是否已被刷新?

【问题讨论】:

  • 在这种情况下,不,因为我在这个小程序中的目标是检查文件是否存在,并且是否已完全写入。但是f.read() 会解决我的问题吗? (未刷新缓冲区的问题)

标签: python file-io buffer


【解决方案1】:

不要为此使用while-loop。有一个更好的方法,虽然细节取决于你的操作系统。

Linux 有inotify。您可以编写一个简单的pyinotify 脚本来监视目录并对IN_CLOSE_WRITE 事件作出反应(仅在文件关闭后发生)。

OSX (FSEvents) 和Windows 有类似的设施。

【讨论】:

  • 谢谢,这正是我要找的。我使用 pyinotify 来监控 FS 的变化,但我没有想到将它用于这个非常简单的任务。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      一般来说,Linux 没有任何问题,一个进程打开文件进行读取,而另一个进程打开文件进行写入。考虑做tail -f $SOME_FILE 之类的事情来实时跟踪文件的更新;如果试图打开文件进行读取必须阻塞并等到作者关闭文件,这不可能工作。

      【讨论】:

        猜你喜欢
        • 2012-09-19
        • 2021-10-01
        • 1970-01-01
        • 2017-07-14
        • 2018-07-03
        • 1970-01-01
        • 2018-07-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多