使用readline读取动态更新的日志文件无法获取新增内容是否为标准行为?
该行为属于标准行为,你遗漏了两个核心机制
1. 文件IO的EOF标记缓存
当你第一次遍历读完整个文件后,Python文件对象对应的操作系统文件句柄已经到达文件末尾(EOF),此时操作系统的IO层和Python的IO封装都会标记当前流已结束,后续默认调用readline()会直接返回空字符串,不会主动重新检查文件内容是否更新。
如果是同文件追加写入的内容,你可以通过调用seek()方法重置EOF标记后读取:
# 读完所有内容到达EOF后执行,重置EOF状态 f.seek(f.tell()) # 此时再调用readline()就能读到追加的新内容 line = f.readline()
2. Vim的默认保存机制替换了原文件
你用Vim编辑保存的操作,本质上不是在原文件末尾追加内容:Vim会先写入临时交换文件,校验无误后删除原文件,再将临时文件重命名为原文件名。这意味着你之前打开的文件句柄指向的是已经被删除的旧版本文件,和保存后的新文件是完全独立的两个文件(可以通过ls -i myfile.log查看保存前后的inode编号,会发现发生了变化),自然读不到新写入的内容。
如果换用追加写入的方式修改文件(比如执行echo "新增行" >> myfile.log),文件inode不会变化,配合上述seek()操作就能读到新内容。
内容的提问来源于stack exchange,提问作者Silverspur
相关产品推荐
相关产品推荐

