,,python 使用fileinput读取文件

,,python 使用fileinput读取文件

本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: