这个Python读取文件的方法,堪称天花板级别...

简介: Python学习


今天来了解一下 fileinput 。

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

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

但是,今天我还是要介绍fileinput这个方法,因为太奈斯了。

不止是香。是真香!

正文

1、方法介绍

基本用法

先来看一下fileinput的基本功能:

fileinput.filename():返回当前被读取的文件名。—>在第一行被读取之前,返回 None。

fileinput.fileno():返回以整数表示的当前文件“文件描述符”。—>当未打开文件时(处在第一行和文件之间),返回 -1。

fileinput.lineno():返回已被读取的累计行号。—>在第一行被读取之前,返回 0。在最后一个文件的最后一行被读取之后,返回该行的行号。

fileinput.filelineno():返回当前文件中的行号。—>在第一行被读取之前,返回 0。—>在最后一个文件的最后一行被读取之后,返回此文件中该行的行号。

进阶用法

fileinput.isfirstline():如果刚读取的行是其所在文件的第一行则返回 True,否则返回 False。

fileinput.isstdin():如果最后读取的行来自 sys.stdin 则返回 True,否则返回 False。

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

fileinput.close():关闭序列。

2、 默认读取

代码示例

importfileinput'当 Python 脚本没有传入任何参数时,fileinput 默认会以 stdin 作为输入源'forlineinfileinput.input():
print(f'{line}')

运行结果

image.png

你输入的内容,程序都会读取并再输出。

俗称:复读机

1

3、处理一个文件

代码示例

importfileinput'files 输入打开文件的名称即可'withfileinput.input(files=('output.txt',)) asfile:
forlineinfile:
print(f'{fileinput.filename()}{fileinput.lineno()}行:{line}',end='')

运行结果

image.png

解析:

  • fileinput 有且仅有这两种读取模式:‘r’,‘rb’;
  • fileinput.input() 默认使用 mode=‘r’ 的模式读取文件,如果你的文件是二进制的,可以使用mode=‘rb’ 模式。

4、处理批量文件

多文件序号连续排序

调用方法

  • fileinput.lineno()方法代码示例
importfileinput'files 输入打开文件的名称即可'withfileinput.input(files=('output.txt','input.txt')) asfile:
forlineinfile:
#fileinput.lineno() 把两个文件的整合陈一个文件对象file,需要排序输出print(f'{fileinput.filename()}{fileinput.lineno()}行: {line}', end='')
# fileinput.filelineno()两个文件单独读取,需要单独排序print(f'{fileinput.filename()}{fileinput.filelineno()}行: {line}', end='')

运行结果

image.png

多文件序号单独排序

调用方法

  • fileinput.filelineno()方法代码示例
importfileinput'files 输入打开文件的名称即可'withfileinput.input(files=('test1.txt','test2.txt')) asfile:
forlineinfile:       
# fileinput.filelineno()两个文件单独读取,需要单独排序print(f'{fileinput.filename()}{fileinput.filelineno()}行: {line}', end='')

运行结果

image.png

与glob配合用法

在颜值的时代,上面的输出样式,已经无法满足我们的需要了,于是乎,我们就想到了glob。

代码示例

importfileinputimportglob#glob 匹配te开头的txt文件forlineinfileinput.input(glob.glob("te*.txt")):
iffileinput.isfirstline():
#输出读取文件print('='*10,f'读取文件{fileinput.filename()}','='*10)
#fileinput.filelineno()方法读取print(str(fileinput.filelineno())+':'+line.upper(),end='')

运行结果

image.png

就这颜值,哪个小姐姐能不喜欢呢。

5、读取与备份

调用方法

  • fileinput.input 的backup 参数,可以指定备份的后缀名,比如 .bak代码示例
importfileinput#触发backup的动作,源文件内容被修改,对源文件进行backupwithfileinput.input(files=("test1.txt",), backup=".bak",inplace=1) asfile:
forlineinfile:
print(line.rstrip().replace('111111', '222222'))
print(f'{fileinput.filename()}{fileinput.lineno()}行: {line}', end='')

运行结果

image.png

6、重定向替换

解析

  • 上面的例子, 用到了 inplace参数,表示是否将标准输出的结果写回文件,默认不取代。代码示例:
importfileinput#触发backup的动作,源文件内容被修改,对源文件进行backupwithfileinput.input(files=("test2.txt",), inplace=True) asfile:
print("[INFO] task is started...")
forlineinfile:
print(f'{fileinput.filename()}{fileinput.lineno()}行: {line}', end='')
print("[INFO] task is closed...")

运行结果

image.png

通过运行结果,可以看到:

  • 在 for 循环体内的 print 内容会写回到原文件中了。
  • 而在 for 循环体外的 print 则没有变化。

7、进阶

openhook含义解析

  • 在 fileinput.input() 中有一个 openhook 的参数,它支持用户传入自定义的对象读取方法;
  • 如果没有传入任何勾子,fileinput 默认使用的是 open 函数;方法介绍

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”))示例实战

假如我想要使用 fileinput 来读取网络上的文件,思路:

  • 先使用 requests 下载文件到本地
  • 再使用 open 去读取它;
defonline_open(url, mode):
importrequestsr=requests.get(url) 
filename=url.split("/")[-1]
withopen(filename,'w') asf1:
f1.write(r.content.decode("utf-8"))
f2=open(filename,'r')
returnf2直接将这个函数传给openhook即可:importfileinputfile_url='https://www.csdn.net/robots.txt'withfileinput.input(files=(file_url,), openhook=online_open) asfile:
forlineinfile:
print(line, end="")
代码整合:defonline_open(url, mode):
importrequestsr=requests.get(url)
filename=url.split("/")[-1]
withopen(filename,'w') asf1:
f1.write(r.content.decode("utf-8"))
f2=open(filename,'r')
returnf2importfileinputfile_url='https://www.csdn.net/robots.txt'withfileinput.input(files=(file_url,), openhook=online_open) asfile:
forlineinfile:
print(line, end="")

运行结果

image.png

总结

关于fileinput的介绍,也就介绍到这里。

fileinput本身是对 open 函数的再次封装,所以在读取的cc部分,就比open显得更专业,更优雅,这也是仅限于读取的方面。在写的方面,相对于open,就不是那么的强悍。

归根结底,fileinput还是一个不错的方法。值得你拥有。

相关文章
|
11天前
|
机器学习/深度学习 存储 算法
解锁文件共享软件背后基于 Python 的二叉搜索树算法密码
文件共享软件在数字化时代扮演着连接全球用户、促进知识与数据交流的重要角色。二叉搜索树作为一种高效的数据结构,通过有序存储和快速检索文件,极大提升了文件共享平台的性能。它依据文件名或时间戳等关键属性排序,支持高效插入、删除和查找操作,显著优化用户体验。本文还展示了用Python实现的简单二叉搜索树代码,帮助理解其工作原理,并展望了该算法在分布式计算和机器学习领域的未来应用前景。
|
11天前
|
JSON 数据可视化 API
Python 中调用 DeepSeek-R1 API的方法介绍,图文教程
本教程详细介绍了如何使用 Python 调用 DeepSeek 的 R1 大模型 API,适合编程新手。首先登录 DeepSeek 控制台获取 API Key,安装 Python 和 requests 库后,编写基础调用代码并运行。文末包含常见问题解答和更简单的可视化调用方法,建议收藏备用。 原文链接:[如何使用 Python 调用 DeepSeek-R1 API?](https://apifox.com/apiskills/how-to-call-the-deepseek-r1-api-using-python/)
|
3月前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
165 3
|
21天前
|
监控 网络安全 开发者
Python中的Paramiko与FTP文件夹及文件检测技巧
通过使用 Paramiko 和 FTP 库,开发者可以方便地检测远程服务器上的文件和文件夹是否存在。Paramiko 提供了通过 SSH 协议进行远程文件管理的能力,而 `ftplib` 则提供了通过 FTP 协议进行文件传输和管理的功能。通过理解和应用这些工具,您可以更加高效地管理和监控远程服务器上的文件系统。
51 20
|
28天前
|
人工智能 自然语言处理 算法
随机的暴力美学蒙特卡洛方法 | python小知识
蒙特卡洛方法是一种基于随机采样的计算算法,广泛应用于物理学、金融、工程等领域。它通过重复随机采样来解决复杂问题,尤其适用于难以用解析方法求解的情况。该方法起源于二战期间的曼哈顿计划,由斯坦尼斯拉夫·乌拉姆等人提出。核心思想是通过大量随机样本来近似真实结果,如估算π值的经典示例。蒙特卡洛树搜索(MCTS)是其高级应用,常用于游戏AI和决策优化。Python中可通过简单代码实现蒙特卡洛方法,展示其在文本生成等领域的潜力。随着计算能力提升,蒙特卡洛方法的应用范围不断扩大,成为处理不确定性和复杂系统的重要工具。
69 21
|
26天前
|
数据挖掘 数据处理 开发者
Python3 自定义排序详解:方法与示例
Python的排序功能强大且灵活,主要通过`sorted()`函数和列表的`sort()`方法实现。两者均支持`key`参数自定义排序规则。本文详细介绍了基础排序、按字符串长度或元组元素排序、降序排序、多条件排序及使用`lambda`表达式和`functools.cmp_to_key`进行复杂排序。通过示例展示了如何对简单数据类型、字典、类对象及复杂数据结构(如列车信息)进行排序。掌握这些技巧可以显著提升数据处理能力,为编程提供更强大的支持。
32 10
|
27天前
|
存储 数据采集 数据处理
如何在Python中高效地读写大型文件?
大家好,我是V哥。上一篇介绍了Python文件读写操作,今天聊聊如何高效处理大型文件。主要方法包括:逐行读取、分块读取、内存映射(mmap)、pandas分块处理CSV、numpy处理二进制文件、itertools迭代处理及linecache逐行读取。这些方法能有效节省内存,提升效率。关注威哥爱编程,学习更多Python技巧。
|
28天前
|
存储 JSON 对象存储
如何使用 Python 进行文件读写操作?
大家好,我是V哥。本文介绍Python中文件读写操作的方法,包括文件读取、写入、追加、二进制模式、JSON、CSV和Pandas模块的使用,以及对象序列化与反序列化。通过这些方法,你可以根据不同的文件类型和需求,灵活选择合适的方式进行操作。希望对正在学习Python的小伙伴们有所帮助。欢迎关注威哥爱编程,全栈路上我们并肩前行。
|
1月前
|
存储 算法 Serverless
剖析文件共享工具背后的Python哈希表算法奥秘
在数字化时代,文件共享工具不可或缺。哈希表算法通过将文件名或哈希值映射到存储位置,实现快速检索与高效管理。Python中的哈希表可用于创建简易文件索引,支持快速插入和查找文件路径。哈希表不仅提升了文件定位速度,还优化了存储管理和多节点数据一致性,确保文件共享工具高效运行,满足多用户并发需求,推动文件共享领域向更高效、便捷的方向发展。
|
2月前
|
计算机视觉 Python
如何使用Python将TS文件转换为MP4
本文介绍了如何使用Python和FFmpeg将TS文件转换为MP4文件。首先需要安装Python和FFmpeg,然后通过`subprocess`模块调用FFmpeg命令,实现文件格式的转换。代码示例展示了具体的操作步骤,包括检查文件存在性、构建FFmpeg命令和执行转换过程。
76 7

热门文章

最新文章

推荐镜像

更多