上一篇
什么是fileinput模块?
Python的fileinput
模块提供了一种简单而高效的方式来迭代处理多个输入流(如文件列表或标准输入)。它特别适合需要处理命令行提供的文件序列的场景。
主要特点: 自动处理多个文件、支持原地文件修改、提供当前文件信息、处理压缩文件
为什么要使用fileinput模块?
- 简化处理多个文件的代码
- 自动处理文件打开和关闭
- 轻松获取当前文件名和行号
- 支持标准输入作为输入源
- 可以原地修改文件内容
- 内置支持gzip和bzip2压缩文件
基本用法
使用fileinput.input()
函数创建FileInput对象,然后可以直接在循环中使用:
示例:基本文件读取
import fileinput
# 遍历所有输入行
for line in fileinput.input():
# 处理每一行
processed_line = line.strip().upper()
# 输出处理后的行
print(f"{fileinput.filename()}:{fileinput.filelineno()} - {processed_line}")
核心函数和方法
函数/方法 | 描述 | 返回值 |
---|---|---|
fileinput.input(files=None, inplace=False, backup='', mode='r', openhook=None) |
创建FileInput对象 | FileInput实例 |
fileinput.filename() |
当前文件名 | 字符串 |
fileinput.fileno() |
当前文件的文件描述符 | 整数 |
fileinput.lineno() |
累计行号(所有文件) | 整数 |
fileinput.filelineno() |
当前文件中的行号 | 整数 |
fileinput.isfirstline() |
是否是当前文件的第一行 | 布尔值 |
fileinput.isstdin() |
当前行是否来自sys.stdin | 布尔值 |
fileinput.nextfile() |
关闭当前文件,移动到下一个文件 | None |
fileinput.close() |
关闭FileInput对象 | None |
实用示例
示例1:多文件搜索工具
创建一个简单的文本搜索工具,在多个文件中查找特定字符串:
文件搜索工具
import fileinput
import sys
# 获取搜索词
search_term = sys.argv[1] if len(sys.argv) > 1 else None
if not search_term:
print("请提供搜索词")
sys.exit(1)
# 处理文件(从命令行参数获取)
for line in fileinput.input(sys.argv[2:]):
if search_term in line:
# 输出匹配行(包含文件名和行号)
print(f"{fileinput.filename()}[{fileinput.filelineno()}]: {line.strip()}")
使用方法: python search.py "keyword" file1.txt file2.txt
示例2:原地文件修改
使用inplace
参数直接修改文件内容:
文件内容替换
import fileinput
# 原地修改文件(创建备份文件)
with fileinput.input(files=('config.txt',), inplace=True, backup='.bak') as f:
for line in f:
# 将"DEBUG=False"替换为"DEBUG=True"
if line.strip() == "DEBUG=False":
print("DEBUG=True")
else:
print(line, end='')
注意: 使用inplace=True
时,原始文件会被重命名备份,标准输出会重定向到原始文件
高级用法
处理压缩文件
使用openhook
参数处理压缩文件:
import fileinput
import gzip
# 处理gzip压缩文件
with fileinput.input(
files=('data1.gz', 'data2.gz'),
openhook=fileinput.hook_compressed
) as f:
for line in f:
process(line)
自定义文件打开方式
使用自定义的openhook处理文件:
import fileinput
def utf8_opener(filename, mode):
return open(filename, mode, encoding='utf-8')
# 使用UTF-8编码打开文件
with fileinput.input(files=('data.txt',), openhook=utf8_opener) as f:
for line in f:
process(line)
最佳实践
- 使用
with
语句确保文件正确关闭 - 处理大文件时逐行读取,避免内存问题
- 在循环中避免调用
fileinput.filename()
等函数多次 - 使用
fileinput.filelineno()
而不是fileinput.lineno()
获取文件内行号 - 使用
inplace
参数时务必先备份重要文件
总结
Python的fileinput
模块是处理多个输入文件的强大工具。通过本教程,您已经学会了如何:
- 逐行读取多个文件
- 获取文件名和行号信息
- 原地修改文件内容
- 处理压缩文件
- 创建实用的文件处理脚本
现在就开始使用fileinput
模块来简化您的文件处理任务吧!
发表评论