首页 > 代码库 > python基础教程_学习笔记15:标准库:一些最爱——fileinput

python基础教程_学习笔记15:标准库:一些最爱——fileinput

标准库:一些最爱

fileinput

重要的函数

函数

描述

input([files[,inplace[,backup]])

便于遍历多个输入流中的行

filename()

返回当前文件的名称

lineno()

返回当前(累计)的名称

filelineno()

返回当前文件的行数

isfirstline()

检查当前行是否是文件的第一行

isstdin()

检查最后一行是否来自sys.stdin

nextfile()

关闭当前文件,移动到下一个文件

close()

关闭序列

 

fileinput.input是其中最重要的函数。它会返回能够用于for循环遍历的对象,如果不想使用默认行为(fileinput查找需要循环变量的文件),那么可以给函数提供(序列形式的)一个或多个文件名。还能inplace参数设置为真值(inplace=True)以进行原地处理。对于要访问的每一行,需要打印出替代的内容,以返回到当前的输入文件中。在进行原地处理的时候,可选的backup参数将文件名扩展备份到通过原始文件创建的备份文件中。

 

fileinput.filename函数返回当前正在处理的文件名。

fileinput.lineno返回当前行的行数。这个数值是累计的,所以在完成一个文件的处理并且开始处理下一个文件的时候,行数并不会重置,而是将上一个文件的最后行数加1作为计数的起始。

fileinput.filelineno返回当前处理文件的当前行数。每次处理完一个文件并且开始处理下一个文件时,行数都会重置为1,然后重新开始计数。

fileinput.isfirstline函数在当前行是当前文件的第一行时返回真值,反之返回假值。

fileinput.isstdin函数在当前文件为sys.stdin时返回真值, 否则返回假值。

fileinput.nextfile函数会关闭当前文件,跳到下一个文件,跳过的行并不计。在你知道当前文件已经处理完的情况下,就比较有用了。

fileinput.close函数关闭整个文件链,结束迭代。

 

 

$ cat numberlines.py

# File : numberlines.py

 

import fileinput

 

for line in fileinput.input(inplace=1):

        line=line.rstrip()

        num=fileinput.lineno()

        print ‘%-40s # %2i‘ %(line,num)

 

$ python numberlines.py  numberlines.py

结果

$ cat numberlines.py

# File : numberlines.py #  1

#  2

import fileinput #  3

#  4

for line in fileinput.input(inplace=1): #  5

        line=line.rstrip()               #  6

        num=fileinput.lineno() #  7

        print ‘%-40s # %2i‘ %(line,num) #  8

 

如果运行多次,则每次运行都会在每一行末尾添加多个行号,但这不一定是我们想要的效果。

$ python numberlines.py  numberlines.py

结果

$ cat numberlines.py

# File : numberlines.py #  1 #  1

#  2 #  2

import fileinput #  3 #  3

#  4 #  4

for line in fileinput.input(inplace=1): #  5 #  5

        line=line.rstrip() #  6 #  6

        num=fileinput.lineno() #  7 #  7

        print ‘%-40s # %2i‘ %(line,num) #  8 #  8

 

警告:要小心使用replace参数——它很容易破坏文件。应该在不使用inplace设置的情况下细测自己的程序,在确保程序工作正常后再修改文件。

练习 遍历文本文件

脚本内容

$ cat fileinput-example-1.py

#File : fileinput-example-1.py

 

import fileinput

import sys

 

for line in fileinput.input("sys-argv-example-1.py"):

        sys.stdout.write("->")

        sys.stdout.write(line)

 

执行结果

$ python fileinput-example-1.py

-># File:sys-argv-example-1.py

->

->import sys

->

->print "Script name is",sys.argv[0]

->

->if len(sys.argv) > 1:

->      print "there is",len(sys.argv)-1,"arguments:"

->      print [x for x in sys.argv[1:]]

->else:

->      print "there are no arguments!"

 

练习 处理多文件

脚本内容

$ cat fileinput-example-2.py

#File : fileinput-example-2.py

 

import fileinput

import sys,string

import glob

 

for line in fileinput.input(glob.glob("sys-exit-*.py")):

        if fileinput.isfirstline():

                sys.stderr.write("-- reading %s --\n" % fileinput.filename())

        sys.stdout.write(str(fileinput.lineno()) + " " + string.upper(line))

 

执行结果

$ python fileinput-example-2.py

-- reading sys-exit-example-1.py --

1 #FILE :SYS-EXIT-EXAMPLE-1.PY

2

3 IMPORT SYS

4 PRINT "HELLO"

5 SYS.EXIT(1)

6 PRINT "THERE"

7

-- reading sys-exit-example-2.py --

8 #FILE :SYS-EXIT-EXAMPLE-2.PY

9

10 IMPORT SYS

11 PRINT "HELLO"

12 TRY:

13      SYS.EXIT(1)

14 EXCEPT SYSTEMEXIT:

15      PASS

16 PRINT "THERE"

17

 

练习 转换CRLFLF

$ cat fileinput-example-3.py

#File : fileinput-example-3.py

 

import fileinput,sys

 

for line in fileinput.input(inplace=1):

        if line[-2:]=="\r\n":

                line=line[:-2]+"\n"

        sys.stdout.write(line)