Python fileinput模块应用详解

 更新时间:2022年09月23日 11:04:29   作者:A-L-Kun  
说到fileinput,可能90%的码农表示没用过,甚至没有听说过。这不奇怪,因为在python界,既然open可以走天下,何必要fileinput呢,今天我们来了解下它

一、简介

说到fileinput,可能90%的码农表示没用过,甚至没有听说过。

这不奇怪,因为在python界,既然open可以走天下,何必要fileinput呢?。

其为open方法的高级封装:

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

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

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

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

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

二、常用函数

1、描述

fileinput.input()       # 进行读取文件对象的初始化,返回能够用于for循环遍历的对象
# return FileInput(files, inplace, backup, mode=mode, openhook=openhook)
fileinput.filename()    # 返回当前文件的名称
# return fileInput.filename()
fileinput.lineno()      # 返回当前已经读取的行的数量(或者序号)
# return fileInput.lineno()
fileinput.filelineno()  # 返回当前读取的行的行号
# return fileInput.filelineno()
fileinput.isfirstline() # 检查当前行是否是文件的第一行
# return fileInput.isfirstline()
fileinput.isstdin()     # 判断最后一行是否从stdin中读取
# return fileInput.isstdin()
fileinput.close()       # 关闭队列,也是关闭文件

fileinput.nextfile()  # 关闭当前文件以使下次迭代将从下一个文件(如果存在)读取第一行;不是从该文件读取的行将不会被计入累计行数。直到下一个文件的第一行被读取之后文件名才会改变。
# —>在第一行被读取之前,此函数将不会生效;它不能被用来跳过第一个文件。
# —>在最后一个文件的最后一行被读取之后,此函数将不再生效。

2、第一个程序

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "demo02.py"
__email__ = "liu.zhong.kun@foxmail.com"
import fileinput
# 典型用法
for line in fileinput.input():  # 如果input函数里面不传入参数,则,我们需要从命令行传入文件路径
    print(line)

python demo02.py 1.txt 2.txt

三、函数参数

1、参数

我们使用input方法打开文件

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

参数:

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

2、批量处理

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "demo02.py"
__email__ = "liu.zhong.kun@foxmail.com"
import fileinput
from glob import glob  # 使用正则匹配文件
with fileinput.input(files=glob("*.txt"), openhook=fileinput.hook_encoded("utf-8")) as f:  # 读取当前目录下,所有的txt文件
    for line in f:
        print(f"{fileinput.filename()} -> {line.strip()} | 第{fileinput.filelineno()}行 | 共读取{fileinput.lineno()}行")

3、修改备份

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "demo02.py"
__email__ = "liu.zhong.kun@foxmail.com"
import fileinput
from glob import glob  # 使用正则匹配文件
with fileinput.input(files=glob("*.txt"), inplace=True, backup=".bak") as f:  # 读取当前目录下,所有的txt文件,同时新建一个备份文件文件,可以不新建备份文件
    for line in f:
        print(f"{fileinput.filename()} -> {line.strip()} | 第{fileinput.filelineno()}行 | 共读取{fileinput.lineno()}行")  # 在for循环里面的print内容不会输出到控制台上,而是直接输出到文件对应的行里面

四、钩子函数

在 fileinput.input() 中有一个 openhook 的参数,它支持用户传入自定义的对象读取方法;

如果没有传入任何勾子,fileinput 默认使用的是 open 函数

1、内置函数

fileinput 内置了两种勾子

  • fileinput.hook_compressed(filename, mode)

使用 gzip 和 bz2 模块透明地打开 gzip 和 bzip2 压缩的文件(通过扩展名 ‘.gz’ 和 ‘.bz2’ 来识别);

如果文件扩展名不是 ‘.gz’ 或 ‘.bz2’,文件会以正常方式打开(即使用 open() 并且不带任何解压操作);

使用示例: fi = fileinput.FileInput(openhook=fileinput.hook_compressed)

  • fileinput.hook_encoded(encoding, errors=None)

返回一个通过 open() 打开每个文件的钩子,使用给定的 encoding 和 errors 来读取文件。

使用示例: fi = fileinput.FileInput(openhook=fileinput.hook_encoded(“utf-8”, “surrogateescape”))

2、自定义函数

我们定义一个钩子函数,来实现读取网络资源

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "demo02.py"
__email__ = "liu.zhong.kun@foxmail.com"
import fileinput
from glob import glob  # 使用正则匹配文件
from io import StringIO
from requests import get
def getOnlineSource(url, *args, **kwargs):
    resp = get(url)
    resp.encoding = resp.apparent_encoding
    return StringIO(resp.text)  # 文件对象即为字符串流
with fileinput.input("http://www.baidu.com", openhook=getOnlineSource) as f:  # 获取对应url中的资源,并输出
    for line in f:
        print(line)  # 输出每一行内容,即,等于是输出io流中的所有内偶然

到此这篇关于Python fileinput库应用详解的文章就介绍到这了,更多相关Python fileinput库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python 类的继承实例详解

    Python 类的继承实例详解

    这篇文章主要介绍了Python 类的继承实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • 使用Python字符串访问与修改局部变量的实现代码

    使用Python字符串访问与修改局部变量的实现代码

    这篇文章主要介绍了使用Python字符串访问与修改局部变量,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Python正则表达式常用函数总结

    Python正则表达式常用函数总结

    这篇文章主要介绍了Python正则表达式常用函数,结合实例形式总结分析了Python正则表达式常用函数功能、使用方法及相关注意事项,需要的朋友可以参考下
    2017-06-06
  • 如何将DataFrame数据写入csv文件及读取

    如何将DataFrame数据写入csv文件及读取

    在Python中进行数据处理时,经常会用到CSV文件的读写操作,当需要将list数据保存到CSV文件时,可以使用内置的csv模块,若data是一个list,saveData函数能够将list中每个元素存储在CSV文件的一行,但需要注意的是,默认情况下读取出的CSV数据类型为str
    2024-09-09
  • Python中inplace、subset参数的意义及说明

    Python中inplace、subset参数的意义及说明

    这篇文章主要介绍了Python中inplace、subset参数的意义及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Python列表和元组的定义与使用操作示例

    Python列表和元组的定义与使用操作示例

    这篇文章主要介绍了Python列表和元组的定义与使用操作,结合实例形式分析了Python中列表和元组的功能、区别、定义及使用方法,需要的朋友可以参考下
    2017-07-07
  • 关于Keras Dense层整理

    关于Keras Dense层整理

    这篇文章主要介绍了关于Keras Dense层整理,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • python传参时一个星号和两个星号的区别小结

    python传参时一个星号和两个星号的区别小结

    在Python中,一个星号(*)和两个星号(**)用于函数定义中的参数传递,本文主要介绍了python传参时一个星号和两个星号的区别小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Python实现导出数据生成excel报表的方法示例

    Python实现导出数据生成excel报表的方法示例

    这篇文章主要介绍了Python实现导出数据生成excel报表的方法,结合完整实例形式分析了Python连接、查询mysql数据库并导出Excel报表的相关实现技巧,需要的朋友可以参考下
    2017-07-07
  • python运行加速的几种方式

    python运行加速的几种方式

    Python运行的慢是历来被诟病的,本文就来介绍一下python运行加速的几种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07

最新评论