如何检测文件在读取时被截断

2024-04-19 15:06:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在读取一组文件(日志文件)中的行,它们是使用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())

Tags: 文件thepath方法selfreadlinefoo链接
1条回答
网友
1楼 · 发布于 2024-04-19 15:06:33

使用os.lseek(file.fileno(),0,os.SEEK_CUR)可以在不移动文件指针的情况下获得字节偏移量。您不能真正使用常规文件接口来查找,尤其是因为它可能有缓冲文本(不再存在),而Python还没有看到这些文本。如果文件不是字节流(例如,Python3中的默认值open),它甚至可能位于多字节字符的中间,即使文件立即增长到超过文件偏移量,也无法继续。在

相关问题 更多 >