为什么Python的fileinput模块是处理多个输入流的神器?

秋杰大大_2910

秋杰大大_2910

2026-08-07

884人浏览

原创

fileinput不是“神器”,而是在顺序读取多文件且不关心内存时更省心安全的工具;它按需开闭文件避免句柄耗尽,需在循环内调用filename()和isfirstline(),编码错误须显式指定openhook,inplace模式有重命名风险。

为什么python的fileinput模块是处理多个输入流的神器?

fileinput

不是“神器”,它只是在特定场景下比手动 open() 更省心、更安全——尤其是当你需要**顺序读取一堆文件、不关心内存占用、又不想自己管文件开关和异常恢复**的时候。 它解决的不是“能不能做”,而是“少写错、少漏关、少爆内存”。

为什么 fileinput.input() 不会爆文件句柄?

操作系统对同时打开的文件数有限制(常见默认 1024)。手动用 for f in files: with open(f) as fp: 嵌套太深或忘了 with,就容易触发 OSError: [Errno 24] Too many open files。
fileinput.input() 内部严格按需打开、读完一行立刻缓冲、换文件时自动关闭前一个句柄——你传一百个文件,同一时刻最多只打开 1 个。

  • 它不缓存全部内容,只维护当前文件的 fp 和读取位置
  • 遇到空文件会立即 close(),不占资源
  • 即使某个文件中途 OSError,已打开的其他文件仍会被正常清理(尤其在 with 块中)

fileinput.filename() 和 fileinput.isfirstline() 怎么配合用才不踩坑?

这两个函数必须在 for line in fileinput.input(...) 循环体内调用,且顺序敏感:只有读到新文件第一行时,fileinput.isfirstline() 才返回 True,此时 fileinput.filename() 已更新为新文件名。

  • 不能在循环外调用 fileinput.filename(),否则返回 None
  • 不能靠 fileinput.lineno() == 1 判断首行——它是全局累计行号,不是当前文件内行号
  • 想在每份文件开头插入分隔符,得写成:if fileinput.isfirstline(): print(f'=== {fileinput.filename()} ===')

编码错误频发?openhook 参数不是摆设

fileinput.input() 默认用系统编码(如 Windows 上是 cp936),遇到 UTF-8 文件无 BOM 就直接抛 UnicodeDecodeError。这不是 bug,是设计如此——它不做猜测,要你显式声明。

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载
  • 必须传 openhook=fileinput.hook_encoded('utf-8'),而不是只写 encoding='utf-8'(后者在旧版本 Python 中无效)
  • hook_compressed() 仅支持 .gz/.bz2,不支持 .zip 或 .xz;自定义 openhook 函数必须接收 filename 和 mode 两个参数,并返回类文件对象
  • 路径不存在或权限不足时,fileinput 照样报 OSError,它不帮你跳过——校验路径得前置做

别误用 inplace=True 模式

这个参数开启后,fileinput 会把 print() 输出重定向到当前输入文件,实现“边读边写”。但它本质是先 mv 原文件 + 创建同名新文件 + 写入 + 关闭,所以:

  • 原文件被 rename,硬链接失效,符号链接指向丢失
  • 如果中途崩溃,可能只剩备份文件(带 backup 后缀),原文件已消失
  • 不能用于标准输入(sys.stdin)或管道流,会报 RuntimeError
  • 多文件时,每个文件独立处理,但 fileinput.filename() 在 inplace 模式下仍可用

真正容易被忽略的是:它不提供任何跨文件原子性保证,也不做内容校验。所谓“神器”,只是把常见陷阱封装得更隐蔽——用之前,得清楚自己到底要不要它那套自动管理逻辑。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1811

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4784

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1769

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

28537

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3427

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3427

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1223

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2663

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习