当前位置:首页 > Python > 正文

Python fileinput模块教程:逐行读取多个文件 | Python文件处理指南

Python fileinput模块教程

学习如何高效地逐行读取和处理多个文件

什么是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时,原始文件会被重命名备份,标准输出会重定向到原始文件

高级用法

1 处理压缩文件

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

2 自定义文件打开方式

使用自定义的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模块来简化您的文件处理任务吧!

Python fileinput模块教程 © 2023 | 提供实用的Python编程指南

发表评论