You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 09:06:05