python基础(fileinput模块)

本文介绍了Python的fileinput模块,用于迭代、遍历文件内容。fileinput.input()是一个迭代对象,适用于大文件处理。主要函数包括:input()、filename()、lineno()、filelineno()、isfirstline()、isstdin()、nextfile()和close()。通过示例展示了如何使用fileinput进行文件内容替换和添加行号。注意使用inplace参数时需谨慎,避免破坏文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

fileinput

fileinput模块可以对一个或多个文件中的内容进行迭代、遍历等操作。

该模块的input()函数有点类似文件readlines()方法,区别在于:

前者是一个迭代对象,即每次只生成一行,需要用for循环迭代。

后者是一次性读取所有行。在碰到大文件的读取时,前者无疑效率更高效。

用fileinput对文件进行循环遍历,格式化输出,查找、替换等操作,非常方便。
 

                                                                 模块fileinput中一些重要的函数
                                           函 数                                                                               描 述
                           input([files[, inplace[, backup]]])                                   帮助迭代多个输入流中的行
                                       filename()                                                               返回当前文件的名称
                                         lineno()                                                             返回(累计的)当前行号
                                      filelineno()                                                            返回在当前文件中的行号
                                      isfirstline()                                                     检查当前行是否是文件中的第一行
                                         isstdin()                                                       检查最后一行是否来自sys.stdin
                                        nextfile()                                                       关闭当前文件并移到下一个文件
                                          close()                                                                          关闭序列

fileinput.input是其中最重要的函数,它返回一个可在for循环中进行迭代的对象。如果要覆盖默认行为(确定要迭代哪些文件),可以序列的方式向这个函数提供一个或多个文件名。还可将参数inplace设置为True(inplace=True),这样将就地进行处理。对于你访问的每一行,都需打印出替代内容,这些内容将被写回到当前输入文件中。就地进行处理时,可选参数backup用于给从原始文件创建的备份文件指定扩展名。

【基本格式】

fileinput.input([files[, inplace[,backup [, bufsize[, mode[, openhook]]]]]])

 

【默认格式】

fileinput.input (files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None)


files:                  #文件的路径列表,默认是stdin方式,多文件['1.txt','2.txt',...]
inplace:                #是否将标准输出的结果写回文件,默认不取代
backup:                 #备份文件的扩展名,只指定扩展名,如.bak。如果该文件的备份文件已存在,则会自动覆盖。
bufsize:                #缓冲区大小,默认为0,如果文件很大,可以修改此参数,一般默认即可
mode:                   #读写模式,默认为只读
openhook:               #该钩子用于控制打开的所有文件,比如说编码方式等;

函数fileinput.filename返回当前文件(即当前处理的行所属文件)的文件名。
函数fileinput.lineno返回当前行的编号。这个值是累计的,因此处理完一个文件并接着处理下一个文件时,不会重置行号,而是从前一个文件最后一行的行号加1开始。
函数fileinput.filelineno返回当前行在当前文件中的行号。每次处理完一个文件并接着处理下一个文件时,将重置这个行号并从1重新开始。
函数fileinput.isfirstline在当前行为当前文件中的第一行时返回True,否则返回False。
函数fileinput.isstdin在当前文件为sys.stdin时返回True,否则返回False。
函数fileinput.nextfile关闭当前文件并跳到下一个文件,且计数时忽略跳过的行。这在你知道无需继续处理当前文件时很有用。例如,如果每个文件包含的单词都是按顺序排列的,而你要查找特定的单词,则过了这个单词所在的位置后,就可放心地跳到下一个文件。
函数fileinput.close关闭整个文件链并结束迭代。

 

例子: 利用fileinput读取一个文件所有行

import fileinput
for line in fileinput.input('parse_url.py'):
    print(line)

例子: 利用fileinput实现文件内容替换,并将原文件作备份

for line in fileinput.input('data.txt',backup='.bak',inplace=1):
    print(line.rstrip().replace('Python','Perl'))

来看一个fileinput使用示例。假设你编写了一个Python脚本,并想给其中的代码行加上行号。鉴于你希望这样处理后程序依然能够正常运行,因此必须在每行末尾以注释的方式添加行号。为让这些行号对齐,可使用字符串格式设置功能。假设只允许每行代码最多包含40个字符,并在第41个字符处开始添加注释。以下代码演示了一种使用模块fileinput和参数inplace来完成这种任务的简单方式。

# numberlines.py 
import fileinput 
for line in fileinput.input(inplace=True): 
    line = line.rstrip() 
    num = fileinput.lineno() 
    print('{:<50} # {:2d}'.format(line, num)) 
如果像下面这样运行这个程序,并将其作为参数传入:
$ python numberlines.py numberlines.py 
这个程序将变成以下代码那样。注意到程序本身被修改了,如果像上面这样运行它多次,每行都将包含多个行号。前面介绍过,rstrip是一个字符串方法,它将删除指定字符串两端的空白,并返回结果。

# numberlines.py                                     # 1 
                                                                # 2 
import fileinput                                         # 3 
                                                                # 4 
for line in fileinput.input(inplace=True):   # 5 
 line = line.rstrip()                                    # 6 
 num = fileinput.lineno()                          # 7 
 print('{:<50} # {:2d}'.format(line, num))   # 8 

务必慎用参数inplace,因为这很容易破坏文件。你应在不设置inplace的情况下仔细测试程序(这样将只打印结果),确保程序能够正确运行后再让它修改文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值