2011-06-02 62 views
2

我正在编写一个脚本,用于轮询查找新文件的目录。在Python写完之前,Python会打开一个文件吗?

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

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

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

这是在Linux系统上。

回答

3

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

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

如果这是一个非首发,你就必须考虑一些方案的作家和读者,例如同步的:

  • 明确锁定文件;
  • 将数据写入临时位置,并且只在文件完成时才将其移至其最终位置(如果源位置和目标位于同一文件系统中,则可以以原子方式完成移动操作)。
+0

+1:“在Unix上”。这个问题不是一个真正的Python问题。 – 2011-06-02 13:57:22

0

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

如果你没有控制程序的写作('控制'我的意思是'编辑源代码'),你可能无法使它做文件锁定,所以这就是大概出去了。在这种情况下,您可能需要了解有关文件格式的信息,以了解作者何时完成。例如,如果作者总是将“DONE”写为文件中的最后四个字符,则可以打开该文件,寻找结尾,并阅读最后四个字符。

+0

需要注意的是,您写入文件的位置以及将文件移动到的位置必须位于* same *文件系统卷上,否则您将遇到同样的问题。 – Gabe 2013-08-27 21:27:25

5

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

  1. 锁定

    通过让笔者应用锁文件,它可以防止读者从部分读取文件。但是,大多数锁都是咨询性的,所以仍然完全有可能看到部分结果。 (存在强制锁定,但强烈建议使用而不是,理由是它们太脆弱了。)编写正确的锁定代码相对困难,并且将这些任务委派给专家库是正常的(例如,数据库引擎!)特别是,你不想在联网的文件系统上使用锁定;它是一个巨大的麻烦,当它的工作原因,往往彻底的错误。

  2. 公约

    一个文件可以代替使用其他名称,你不会自动找上读出侧相同的目录中创建(例如,.foobar.txt.tmp),然后原子重命名为正确的名称(例如,foobar.txt)。这可以很好地工作,只要你注意处理之前的运行无法正确写入文件的可能性。如果一次只能有一个作家,这实现起来相当简单。

  3. 担心的不是它

    被频繁写入文件中最常见的类型是一个日志文件。这些信息可以很容易地以这样一种方式编写,即信息只能附加到文件中,所以任何读者都可以安全地查看文件的开头,而不必担心文件的任何变化。这在实践中运作良好。

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

+0

思考它,它也不是Linux特有的问题。大多数操作系统都有同样的问题。 (Windows有点不同,因为默认情况下锁定的更多,这会导致其他问题。) – 2014-01-12 09:23:49

0

是的。

我更喜欢Donal描述的“文件命名约定”和重命名解决方案。