我正在从一组文件(日志文件)中读取行,因为它们是使用 pyinotify 编写的。
我正在使用 python 本机方法打开和读取文件:
file = open(self.file_path, 'r')
# ... later
line = file.readline()
这通常是稳定的,可以处理被删除和重新创建的文件。pyinotify 将通知取消链接和后续链接。
但是,某些日志文件并未被删除。相反,它们被截断并将新内容写入同一文件的开头。
我无法可靠地检测到何时发生这种情况,因为 pyinotify 只会报告一次写入。我目前得到的唯一证据是 pyinotify 报告写入并readline()
返回一个空字符串。但是,两个后续写入可能会触发相同的行为。
我曾考虑将文件的大小与文件的大小进行比较,file.tell()
但根据文档tell
会产生一个不透明的数字,而且似乎不能相信这是一个字节数。
有没有一种简单的方法来检测文件在读取时被截断?
编辑:
可以使用简单的 shell 命令模拟截断文件:
echo hello > test.log
echo hello >> test.log
# Truncate test.log
echo goodbye > test.log
为了补充这一点,可以使用一个简单的 python 脚本来确认file.tell()
文件被截断时不会减少:
foo = open('./test.log', 'r')
line = foo.readline()
while line != '':
print(foo.tell())
print(line)
line = foo.readline()
# Put a breakpoint on the following line and
# truncate the file before it executes
print(foo.tell())