我正在读取一组文件(日志文件)中的行,它们是使用pyinotify编写的。在
我用python本机方法打开并读取文件:
file = open(self.file_path, 'r')
# ... later
line = file.readline()
这通常是稳定的,可以处理正在删除和重新创建的文件。pyinotify将通知取消链接和后续链接。在
但是一些日志文件没有被删除。相反,它们被截断,新内容被写入同一文件的开头。在
由于pyinotify只报告一个写操作,所以无法可靠地检测到何时发生这种情况。我目前得到的唯一证据是pyinotify报告了一个写操作,readline()
返回一个空字符串。但是,两个后续的写入可能会触发相同的行为。在
我曾考虑过将文件的大小与file.tell()
进行比较,但根据文档,tell
产生了一个不透明的数字,这似乎不能被信任为字节数。在
有没有一种简单的方法来检测文件在读取时被截断了?在
编辑:
可以使用简单的shell命令模拟截断文件:
^{pr2}$为了补充这一点,可以使用一个简单的python脚本来确认文件被截断时{
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())
使用
os.lseek(file.fileno(),0,os.SEEK_CUR)
可以在不移动文件指针的情况下获得字节偏移量。您不能真正使用常规文件接口来查找,尤其是因为它可能有缓冲文本(不再存在),而Python还没有看到这些文本。如果文件不是字节流(例如,Python3中的默认值open
),它甚至可能位于多字节字符的中间,即使文件立即增长到超过文件偏移量,也无法继续。在相关问题 更多 >
编程相关推荐