4

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

1 回答 1

2

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

于 2019-04-14T22:21:08.410 回答