python - 为什么寻找文件的开头重新读取它会在 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()
解决方案
你的 Python 程序唯一的问题是它做出了毫无根据的假设。
在 UNIX 中更改文件内容有两种不同的方法:
- 可以就地修改文件,改变现有inode的内容;
seek()
回到前面并重新阅读会看到,所以如果你的文件是用这种方法编辑的,你现有的代码就可以工作。 您可以创建一个全新的 inode,写入内容,并且只有在写入成功后
rename()
才会覆盖旧的。这通常被认为是更好的做法,因为这意味着正在读取旧文件的程序将保留它们拥有的句柄;他们不会有令人惊讶/不一致/破碎的行为,因为内容从他们下面改变了。如果你做对了(这可能
fsync()
不仅涉及对文件的调用,还涉及对它所在的目录的调用),使用此方法的编写器还可以确保在断电的情况下,新系统将拥有该文件的一个副本或者其他,但不是半写的中间状态,如果你截断现有的 inode 并从头开始重写,你可以获得。
如果你想处理这两种情况,你不能挂在你现有的句柄上,open()
但当你想查看更改时,实际上应该重新生成文件。
推荐阅读
- ios - ios有什么方法可以在不对对象进行分类的情况下进行对象检测?
- dji-sdk - 为什么雷达小部件在 Mavic_2 中不起作用?
- powershell - 过滤 Get-WmiObject 类属性输出以仅包含值
- http - 在flutter http请求中为所有请求设置默认标头的最佳方法
- php - 如何修复 Codeigniter 中未找到请求的 URL 错误
- arm - USB CDC 通信设备等待来自主机的第二个命令以发送对第一个命令的响应
- python - 根据熊猫中另一列中的值添加列的值
- javascript - 如何防止javascript中的多次确认对话
- html - 如何修复 pingdom 测试结果中的阻塞状态?
- angular - 部署后在生产中加载卡盘 X 失败