Python实现读取文件的方法总结_第1页
Python实现读取文件的方法总结_第2页
Python实现读取文件的方法总结_第3页
Python实现读取文件的方法总结_第4页
Python实现读取文件的方法总结_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第Python实现读取文件的方法总结目录序言1、方法介绍2、默认读取3、处理一个文件4、处理批量文件5、读取与备份6、重定向替换7、进阶总结

序言

哈喽兄弟们,今天咱们来了解一下fileinput。

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

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

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

不止是香。是真香!

接下来,就跟着我,一起fileinput,对,就是这个feel。

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}')

运行结果

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

俗称:复读机

3、处理一个文件

代码示例

importfileinput

'files输入打开文件的名称即可'

withfileinput.input(files=('output.txt',))asfile:

forlineinfile:

print(f'{fileinput.filename()}第{fileinput.lineno()}行:{line}',end='')

运行结果

解析:

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='')

运行结果

多文件序号单独排序

调用方法

fileinput.filelineno()方法

代码示例

importfileinput

'files输入打开文件的名称即可'

withfileinput.input(files=('test1.txt','test2.txt'))asfile:

forlineinfile:

#fileinput.filelineno()两个文件单独读取,需要单独排序

print(f'{fileinput.filename()}第{fileinput.filelineno()}行:{line}',end='')

运行结果

与glob配合用法

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

代码示例

importfileinput

importglob

#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='')

运行结果

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

5、读取与备份

调用方法

fileinput.input的backup参数,可以指定备份的后缀名,比如.bak

代码示例

importfileinput

#触发backup的动作,源文件内容被修改,对源文件进行backup

withfileinput.input(files=("test1.txt",),backup=".bak",inplace=1)asfile:

forlineinfile:

print(line.rstrip().replace('111111','222222'))

print(f'{fileinput.filename()}第{fileinput.lineno()}行:{line}',end='')

运行结果

6、重定向替换

解析

上面的例子,用到了inplace参数,表示是否将标准输出的结果写回文件,默认不取代。

代码示例:

importfileinput

#触发backup的动作,源文件内容被修改,对源文件进行backup

withfileinput.input(files=("test2.txt",),inplace=True)asfile:

print("[INFO]taskisstarted...")

forlineinfile:

print(f'{fileinput.filename()}第{fileinput.lineno()}行:{line}',end='')

print("[INFO]taskisclosed...")

运行结果

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

在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):

importrequests

r=requests.get(url)

filename=url.split("/")[-1]

withopen(filename,'w')asf1:

f1.write(r.content.decode("utf-8"))

f2=open(filename,'r')

returnf2

直接将这个函数传给openhook即可:

#-*-coding:utf-8-*-

#@Time:2025-07-23

#@Author:carl_DJ

importfileinput

file_url='/robots.txt'

withfileinput.input(files=(file_url,),openhook=online_open)asfile:

forlineinfile:

print(line,end="")

代码整合:

#-*-coding:utf-8-*-

#@Time:2025-07-23

#@Author:carl_DJ

defonline_open(url,mode):

importrequests

r=requests.get(url)

filename=url.split("/")[-1]

withopen(filename,'w')asf1:

f1.write(r.content.decode("utf-8"))

f2=open(filename,'r')

returnf2

importfileinput

file_url='/robots.txt'

withfileinput.input(files=(fi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论