fileinput适合“只读+逐行+多文件合并处理”的简单场景,但默认不支持写入、不保留文件上下文、遇编码错误直接崩溃;需显式指定openhook编码,filename()和filelineno()分别返回当前文件名和当前文件内行号,lineno()为全局累计行号。

fileinput 是 Python 标准库中轻量但易出错的多文件迭代工具,它不返回文件对象,也不支持随机访问,只适合“顺序读一行、处理一行”的简单批处理场景。
fileinput.input() 的参数行为必须搞清
直接传入文件路径列表(如 fileinput.input(['a.txt', 'b.txt']))是可行的,但要注意:inplace=True 会原地修改第一个文件,后续文件被跳过;openhook=fileinput.hook_encoded('utf-8') 必须显式指定,否则默认用系统编码(Windows 上常为 cp1252),读中文就报 UnicodeDecodeError。
- 不要传入
sys.argv[1:]后再手动检查空列表——fileinput.input([])会退化为读取stdin,行为突变 -
backup='.bak'只在inplace=True时生效,且备份文件名固定追加,不能控制路径 - 若某文件不存在,
fileinput默认静默跳过——需配合fileinput.filename()和fileinput.isfirstline()手动校验
如何安全获取当前行的元信息
fileinput.filename() 返回当前正在读的文件名,但仅在进入新文件**第一行**后才更新;fileinput.filelineno() 是当前文件内的行号(从 1 开始),fileinput.lineno() 是全局累计行号。三者混用容易误判上下文。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 在循环开头立刻检查
if fileinput.isfirstline(): print(f"开始处理 {fileinput.filename()}") - 避免在
except块里调用fileinput.filename()——异常发生时文件可能已切换 -
fileinput.lineno()在inplace=True模式下包含写入的行数,不是原始输入行数
替代方案比死磕 fileinput 更可靠
多数真实需求(如按行过滤、统计、转换)用 pathlib.Path + open() 更直观可控,还能用 concurrent.futures 并行加速;fileinput 唯一优势是内存占用略低(单行缓冲),但代价是隐式状态和脆弱的错误恢复能力。
立即学习“Python免费学习笔记(深入)”;
- 需要统一编码?直接
for p in [Path('a.txt'), Path('b.txt')]: with p.open(encoding='utf-8') as f: ... - 要跳过二进制文件?
fileinput完全无法识别,而pathlib可先p.stat().st_size或magic库检测 - 想中断处理并保留已处理文件进度?
fileinput没有 checkpoint 机制,必须自己记录最后成功处理的filename()和filelineno()
真正棘手的点不在语法,而在它把「文件切换」「编码错误」「缺失文件」「inplace 写入冲突」全藏在迭代器背后——出问题时你甚至不确定当前行来自哪个文件。

















