Python fileinput模块应用详解
作者:A-L-Kun 发布时间:2021-06-23 14:28:09
一、简介
说到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流中的所有内偶然
来源:https://blog.csdn.net/qq_62789540/article/details/126034655
猜你喜欢
- 一.Memory Dumps 1).Global Area ALTER SESSION SET EVENTS ‘immediate trac
- 在广大网友心目中,他们就是中国互联网搜索领域的三驾马车。无论这三家搜索巨头承不承认,在网友眼中总会来将他们进行对比比较。当然,更多时候的比较
- function nohtml(str) dim re Set re=new 
- 推荐idea最新激活码:最新Idea激活码永久激活(最新测试有效)https://www.jb51.net/article/178193.h
- 0x01 前言Nessus是一个功能强大而又易于使用的远程安全扫描器,Nessus对个人用户是免费的,只需要在官方网站上填邮箱,立马就能收到
- 在学习与运用ASP中,response对象涉及到的方面也比较多,想全部都掌握也并非一两天的事,我也是最近才发现response对象中居然有这
- 一、Scrapy框架简介Scrapy是用纯Python实现一个为了爬取网站数据,提取结构性数据而编写的应用框架,用途非常广泛。利用框架,用户
- 在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有反引号括起来的内容。形如:type User struc
- 本文实例为大家分享了Python人脸识别的具体代码,供大家参考,具体内容如下1.利用opencv库sudo apt-get install
- 导言:在前面的教程我们阐述了应用程序处理二进制数据的2种模式,以及使用FileUpload 控件从浏览器向服务器文件系统上传文件。当文件上传
- MatplotlibMatplotlib 是Python中类似 MATLAB 的绘图工具,熟悉 MATLAB 也可以很快的上手 Matplo
- Timedelta转换为Int或Float方式Pandas处理import pandas as pddataSet['t']
- 参数让我们进一步看看CPU的数量是如何影响这些参数的。 参数fast_start_parallel_rollback Oracle并行机制中
- Python 通过pip安装Django详细介绍经过前面的 Python 包管理工具的学习,接下来我们就要基于前面的知识,来配置 Djang
- 别人复制你网站的文章时自动加上注释,这个功能你在很多网站应该都有体会过,当我们复制一段内容时,就自动在文章后面加上了网站的一些
- 最近研究了京东商城用jQuery的实现如下:就是默认地址赋给img标签的src2属性,显示时赋给src属性值。function lazylo
- 废话不多说,直接上代码吧!# -*- coding: utf-8 -*-import cv2import numpy as np# ----
- 前言:『入门MySQL』系列文章已经完结,今后我的文章还是会以MySQL为主,主要记录下近期工作及学习遇到的场景或者自己的感悟想法,可能后续
- 本文实例讲述了Python 私有化操作。分享给大家供大家参考,具体如下:私有化xx: 公有变量_x: 单前置下划线,私有化属性或方法,fro
- 本文实例为大家分享了python生成圆形图片的具体代码,供大家参考,具体内容如下# -*- coding: utf-8 -*- "