本文主要介绍python使用fileinput读取文件,帮助大家更好的理解和学习使用python。感兴趣的朋友可以了解一下。
:
目录
1.从标准输入读取
2.单独打开一个文件。
3.批量打开多个文件
4.阅读时备份文件。
5.标准输出重定向替换
6.必须引进的方法
7.高级游戏。
8.列举一些实际案例。
9.写在最后。
Fileinput是Python的内置模块,但相信很多人对它并不熟悉。今天我详细讲解了fileinput的所有用法和功能,并列举了一些非常实用的案例。可以说理解和使用都没有问题。
1.从标准输入读取
当Python脚本没有传入任何参数时,默认情况下,fileinput将使用stdin作为输入源。
#演示. py
importfileinput
forlineinfileinput.input():
打印(行)
效果如下:无论你输入什么,程序都会自动读取并打印一遍,就像复读机一样。
$pythondemo.py
你好
你好
大蟒
大蟒
2.单独打开一个文件。
要打开单个文件,只需在“文件”中输入文件名。
importfileinput
with file input . input(files=(' a . txt ',))asfile:
forlineinfile:
print(f ' { file input . filename()} Line { file input . lineno()}:{ Line } ',end=' ')
a.txt的内容如下
你好
世界
执行后,输出如下
$pythondemo.py
A.txt第一行:你好
A.txt第二行:世界
需要注意的是,fileinput.input()默认以mode='r '读取文件。如果你的文件是二进制的,你可以使用mode='rb '。Fileinput有且只有这两种读取模式。
3.批量打开多个文件
从上面的例子中还可以看到,我在fileinput.input函数中传递了files参数,该函数接收包含多个文件名的列表或元组。传入一个表示读取一个文件,传入多个表示读取多个文件。
importfileinput
with file input . input(files=(' a . txt ',' b.txt'))asfile:
forlineinfile:
print(f ' { file input . filename()} Line { file input . lineno()}:{ Line } ',end=' ')
a.txt和b.txt的内容分别为
$cata.txt
你好
世界
$catb.txt
你好
大蟒
运行后,输出结果如下。由于a.txt和b.txt的内容被集成到一个file对象文件中,因此只有在读取文件时,fileinput.lineno()才是原始文件中真正的行号。
$pythondemo.py
A.txt第一行:你好
A.txt第二行:世界
b.txt第三行:你好
b.txt的第4行:python
如果在读取多个文件时想读取原文件的实际行号,可以使用fileinput.filelineno()方法。
importfileinput
with file input . input(files=(' a . txt ',' b.txt'))asfile:
forlineinfile:
print(f ' { file input . filename()} Line { file input . file lineno()}:{ Line } ',end=' ')
运行后,输出如下
$pythondemo.py
A.txt第一行:你好
A.txt第二行:世界
b.txt的第一行:你好
b.txt的第2行:python
这种用法与glob模块非常匹配。
importfileinput
importglob
forlineinfileinput . input(glob . glob(' *。txt ')):
iffileinput.isfirstline():
print('-'*20,f ' reading { file input . filename()}.','-'*20)
print(str(file input . lineno())':' line . upper(),end=' ')
运行效果如下
$pythondemo.py
- Readingb.txt.-
1:你好
2:PYTHON
- Readinga.txt.-
3:你好
4:世界
4.阅读时备份文件。
Fileinput.input有一个备份参数,可以指定备份的扩展名,比如。bak。
importfileinput
with file input . input(files=(' a . txt ',),backup='。bak’)作为文件:
forlineinfile:
print(f ' { file input . filename()} Line { file input . lineno()}:{ Line } ',end=' ')
运行结果如下,会多一个a.txt.bak文件。
$ls-la.txt*
-rw-r-r-1 mingstaff 1222710:43a . txt
$pythondemo.py
A.txt第一行:你好
A.txt第二行:世界
$ls-la.txt*
-rw-r-r-1 mingstaff 1222710:43a . txt
-rw-r-r-1 mingstaff 4222710:39a . txt . bak
5.标准输出重定向替换
Fileinput.input有一个inplace参数,它指示是否将标准输出的结果写回文件。默认情况下,它不会被替换。
请参见下面的测试代码。
importfileinput
with file input . input(files=(' a . txt ',),inplace=True)asfile:
打印('[信息]任务已开始.')
forlineinfile:
print(f ' { file input . filename()} Line { file input . lineno()}:{ Line } ',end=' ')
打印('[信息]任务已关闭.')
运行后,你会发现for循环中的打印内容会被写回原文件。然而,除了强制流通之外,印刷没有任何变化。
$cata.txt
你好
世界
$pythondemo.py
[信息]任务已开始.
[信息]任务已关闭.
$cata.txt
A.txt第一行:你好
A.txt第二行:世界
使用这种机制,可以很容易地实现文本替换。
importsys
importfileinput
forlineinfileinput . input(files=(' a . txt ',),inplace=True):
#将Windows/DOS格式的文本文件转换为Linux文件
ifline[-2:]=='\r\n ':
line=line '\n '
sys.stdout.write(行)
附:如何实现DOS和UNIX格式的交换进行程序测试,用vim输入以下指令即可
将DOS转到UNIX: setfileformat=UNIX
UNIX到dos: setfileformat=dos
6.必须引进的方法
如果你只是想让fileinput作为一个读取文件而不是打开的工具,那么以上内容足以满足你的要求。
fileinput.filenam()
返回当前读取的文件名。在读取第一行之前返回None。
fileinput.fileno()
返回当前文件的“文件描述符”,用整数表示。当文件未打开时(在第一行和文件之间),返回-1。
fileinput.lineno()
返回已读取的累积行号。在读取第一行之前返回0。读取最后一个文件的最后一行后,返回该行的行号。
fileinput.filelineno()
返回当前文件中的行号。在读取第一行之前返回0。读取最后一个文件的最后一行后,返回该文件中该行的行号。
但如果想基于fileinput做一些更复杂的逻辑,可能需要使用以下方法。
fileinput.isfirstline()
如果刚刚读取的行是其文件中的第一行,则返回True,否则返回False。
fileinput.isstdin()
如果最后读取的行来自sys.stdin,则返回True,否则返回False。
fileinput.nextfile()
关闭当前文件,以便下一次迭代将从下一个文件(如果存在)读取第一行;未从该文件中读取的行将不会计入累积行数。在读取下一个文件的第一行之前,文件名不会改变。在读取第一行之前,此功能不会生效;它不能用于跳过第一个文件。读取完最后一个文件的最后一行后,该功能将不再生效。
fileinput.close()
关闭序列。
7.高级游戏。
fileinput.input()中有一个openhook参数,支持用户传入自定义的对象读取方法。
如果没有传入任何钩子,fileinput默认使用open函数。
Fileinput内置了两个钩子供您使用。
file input . hook _ compressed(* filename *,*mode*)
使用gzip和bz2模块透明打开由gzip和bzip2压缩的文件(由扩展名'标识)。gz '和'。bz2’)。如果文件扩展名不是。gz '或' . bz2 ',文件将以正常方式打开(即open(),不进行任何解压缩)。示例:fi=file input . file input(open hook=file input . hook _ compressed)
file input . hook _ encoded(* encoding *,*errors=None*)
返回一个钩子,它通过open()打开每个文件,并读取具有给定编码和错误的文件。示例:fi=file input . file input(open hook=file input . hook _ encoded(' UTF-8 ','代理转义'))
如果你自己的场景比较特殊,以上三种挂钩都不能满足你的要求,你也可以定制。
这里举个例子,以此来吸引一个玉。
如果我想使用fileinput来读取网络上的文件,我可以这样定义钩子。
首先使用请求在本地下载文件。
然后用打开来读。
defonline_open(url,mode):
导入请求
r=requests.get(url)
filename=url.split('/')[-1]
withopen(文件名,' w')asf1:
f1 . write(r . content . decode(' utf-8 '))
f2=打开(文件名,' r ')
returnf2
直接把这个函数传递给openhook就可以了
importfileinput
file _ URL=' https://www。csdn。网络/机器人。'文本'
带文件输入。input(files=(file _ URL,),openhook=online_open)asfile:
forlineinfile:
打印(行,结束=' ')
运行后按预期一样将CSDN的机器人的文件打印了出来
用户代理:*
不允许:/脚本
不允许:/public
不允许:/css/
不允许:/images/
不允许:/内容/
不允许:/ui/
不允许:/js/
不允许:/scripts/
不允许:/article_preview.html*
不允许:/tag/
不允许:/*?*
不允许:/link/
网站地图:https://www。csdn。net/sitemap-agg页面索引。可扩展标记语言
网站地图:https://www。csdn。net/article/sitemap。文本文件(textfile)
8.列举一些实用案例
案例一:读取一个文件所有行
importfileinput
forlineinfileinput。输入('数据。txt’):
打印(行,结束=' ')
案例二:读取多个文件所有行
importfileinput
importglob
forlineinfileinput。输入(全球。glob(' * .txt ')):
iffileinput.isfirstline():
打印('-'*20,f '读取{文件输入。filename()} . ','-'*20)
打印(字符串(文件输入。lineno())':'行。upper(),end=“”)
案例三:利用文件输入将CRLF文件转为低频
importsys
importfileinput
forlineinfileinput。input(files=(' a . txt ',),inplace=True):
#将Windows/DOS格式下的文本文件转为Linux操作系统操作系统的文件
ifline[-2:]=='\r\n ':
line=line '\n '
sys.stdout.write(行)
案例四:配合关于做日志分析:取所有含日期的行
# - 样本文件- :error.log
美国汽车协会
错误:* * * * DuetoSystemDiskspackenotenough.
血脑屏障
错误:***DuetoSystemOutofMemory.
控制台控制电路
# - 测试脚本-
进口
importfileinput
importsys
pattern=' \ d { 4 }-\ d { 2 }-\ d { 2 } \ d { 2 }:\ d { 2 }:\ d { 2 } '
forlineinfileinput。输入('错误。日志',备份=').bak ',inplace=1):
ifre.search(模式,行):
sys.stdout.write('=')
sys.stdout.write(行)
# - 测试结果-
=1970-01-0113:45:30错误:* * * * DuetoSystemDiskspackenotenough.
=1970-01-0210:20:30错误:***DuetoSystemOutofMemory.
案例五:利用文件输入实现类似于可做文件内的字符串查找的功能
importsys
进口
importfileinput
模式=重新编译(sys.argv[1])
forlineinfileinput。输入(系统。argv[2]):
ifpattern.match(line):
print(fileinput.filename(),fileinput.filelineno(),line)
$./demo.pyimport.*re*巴拉圭
#查找所有巴拉圭文件中,含进口字样的
addressBook.py2importre
地址簿1 .py10导入
地址簿2 .py18导入
测试。py 238进口
9.写在最后
文件输入是对打开函数的再次封装,在仅需读取数据的场景中,文件输入显然比打开做得更专业、更人性,当然在其他有写操作的复杂场景中,文件输入就无能为力啦,本身从文件输入的命名上就知道这个模块只专注于输入(读)而不是输出(写)。
以上就是大蟒使用文件输入读取文件的详细内容,更多关于大蟒用文件输入读取文件的资料请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。