• Python中fileinput库


    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()  # 关闭当前文件以使下次迭代将从下一个文件(如果存在)读取第一行;不是从该文件读取的行将不会被计入累计行数。直到下一个文件的第一行被读取之后文件名才会改变。
    # —>在第一行被读取之前,此函数将不会生效;它不能被用来跳过第一个文件。
    # —>在最后一个文件的最后一行被读取之后,此函数将不再生效。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    python demo02.py 1.txt 2.txt
    
    • 1

    三、 函数参数

    1、参数

    我们使用input方法打开文件

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

    参数:

    • 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()}行")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    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内容不会输出到控制台上,而是直接输出到文件对应的行里面
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    四、钩子函数

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

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

    1、 内置函数

    fileinput 内置了两种勾子

    1. fileinput.hook_compressed(filename, mode)

      使用 gzip 和 bz2 模块透明地打开 gzip 和 bzip2 压缩的文件(通过扩展名 ‘.gz’ 和 ‘.bz2’ 来识别);
      如果文件扩展名不是 ‘.gz’ 或 ‘.bz2’,文件会以正常方式打开(即使用 open() 并且不带任何解压操作);
      使用示例: fi = fileinput.FileInput(openhook=fileinput.hook_compressed)

    2. 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流中的所有内偶然
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    C++:list?自己模拟实现!
    Python里的类型list是什么?
    如何防止重复提交订单
    Ubuntu下vscode dotNet downloading的问题(Cmake代码高亮)
    jvm优化 JVM 内存大小设置
    Hadoop+hive+flask+echarts大数据可视化之系统数据收集
    Docker之虚悬镜像(查看、删除)
    毕业设计选题uniapp+springboot新闻资讯小程序源码 开题 lw 调试
    C语言——函数的嵌套调用
    【Java】Java核心API概述
  • 原文地址:https://blog.csdn.net/qq_62789540/article/details/126034655