首页 > 解决方案 > 为什么寻找文件的开头重新读取它会在 Windows 上看到更新,但在 Linux 上却看不到?

问题描述

我发现 python 的行为不一致。

在 Windows 下,如果文件更改,程序会注意到。在 Linux 下,程序不会注意到。

我正在使用 python 3.6.8 和 Ubuntu 18.04。

这是一个错误还是我有什么问题?

import time

if __name__ == '__main__':
    file = open('CurrentData.txt', 'r')

    while True:
        lines = file.readlines()

        print(lines)

        time.sleep(1)

        file.seek(0)

    file.close()

标签: pythonpython-3.x

解决方案


你的 Python 程序唯一的问题是它做出了毫无根据的假设。

在 UNIX 中更改文件内容有两种不同的方法:

  • 可以就地修改文件,改变现有inode的内容;seek()回到前面并重新阅读会看到,所以如果你的文件是用这种方法编辑的,你现有的代码就可以工作。
  • 您可以创建一个全新的 inode,写入内容,并且只有在写入成功后rename()才会覆盖旧的。

    这通常被认为是更好的做法,因为这意味着正在读取旧文件的程序将保留它们拥有的句柄;他们不会有令人惊讶/不一致/破碎的行为,因为内容从他们下面改变了。如果你做对了(这可能fsync()不仅涉及对文件的调用,还涉及对它所在的目录的调用),使用此方法的编写器还可以确保在断电的情况下,新系统将拥有该文件的一个副本或者其他,但不是半写的中间状态,如果你截断现有的 inode 并从头开始重写,你可以获得。

如果你想处理这两种情况,你不能挂在你现有的句柄上,open()但当你想查看更改时,实际上应该重新生成文件。


推荐阅读