Python 会在文件完成写入之前打开文件吗?

  • 本文关键字:文件 Python python linux file
  • 更新时间 :
  • 英文 :


我正在编写一个脚本,该脚本将轮询一个目录以查找新文件。

在这种情况下,是否有必要进行某种错误检查,以确保在访问文件之前完全写入文件?

我不想在文件完全写入磁盘之前处理它,但因为我想从文件中获得的信息接近开头,所以似乎可以在没有意识到文件尚未写入的情况下提取我需要的数据。

这是我应该担心的事情吗?还是因为操作系统正在写入硬盘,文件会被锁定?

这是在Linux系统上。

通常在Linux上,除非使用某种锁定,否则两个进程可以很高兴地同时打开同一个文件,即使是用于写入。有三种方法可以避免这个问题:

  1. 锁定

    通过让写入程序对文件应用锁,可以防止读取器部分读取文件。然而,大多数锁都是咨询性的,所以仍然完全有可能看到部分结果。(存在强制锁,但强烈建议不要,因为它们太脆弱了。)编写正确的锁定代码相对困难,将此类任务委托给专业库(即数据库引擎)是正常的!)特别是,您不希望在网络文件系统上使用锁定;当它发挥作用时,它会带来巨大的麻烦,而且经常会彻底出错。

  2. 公约

    相反,可以在同一目录中创建一个文件,该文件具有另一个您不会在读取端自动查找的名称(例如,.foobar.txt.tmp),然后在写入完成后自动重命名为正确的名称(如,foobar.txt)。只要您注意处理以前的运行无法正确写入文件的可能性,这可以很好地工作。如果一次只能有一个编写器,那么实现起来相当简单。

  3. 不用担心

    经常写入的最常见的文件类型是日志文件。这些可以很容易地编写,这样信息就只能严格地附加到文件中,所以任何读者都可以安全地查看文件的开头,而不必担心文件会发生任何变化。这在实践中效果很好。

Python没有什么特别之处。所有在Linux上运行的程序都有相同的问题。

在Unix上,除非编写应用程序出错,否则文件不会被锁定,您可以从中读取。

当然,读者必须做好处理不完整文件的准备(请记住,可能会有I/O缓冲发生在作者一侧)。

如果这不是一个开始,你必须考虑一些同步写入程序和读取器的方案,例如:

  • 显式锁定文件
  • 将数据写入一个临时位置,只有在文件完成时才能将其移动到最终位置(如果源和目标都位于同一文件系统上,则移动操作可以原子式完成)

如果您对写入程序有一定的控制权,请让它将文件写入其他地方(如/tmp目录),然后在完成后将其移动到正在监视的目录。

如果你不能控制程序的编写(我所说的"控制"是指"编辑源代码"),你可能也无法让它进行文件锁定,所以这可能是不可能的。在这种情况下,您可能需要了解一些关于文件格式的信息,才能知道编写程序何时完成。例如,如果编写器总是将"DONE"写为文件中的最后四个字符,则可以打开文件,搜索到末尾,然后读取最后四个字。

是的。

我更喜欢多纳尔描述的"文件命名约定"和重命名解决方案。

相关内容

  • 没有找到相关文章

最新更新