• fileinput模块用法


    • fileinput模块功能:

    提供拼接一个或多个文本文件的功能,可以通过使用for循环来读取一个或多个文本文件的所有行,从而进行逐行处理(如进行显示、替换、添加行号等)。

    其功能类似于linux命令的cat和sed。

    input方法是fileinput模块的主要方法,input方法的参数将传递给FileInput类的构造器来创建FileInput类的一个实例(对象),该实例是一个迭代器,可用于for等迭代环境中,当然也可以用next()、__next__()方法,也支持readline()方法:

    >>> obj_fi=fileinput.input(r'd:syslogin.log')
    >>> type(obj_fi)
    <class 'fileinput.FileInput'>
    >>> print(obj_fi)
    <fileinput.FileInput object at 0x00A5FE90>
    >>> dir(obj_fi)
    ['__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_backup', '_backupfilename', '_file', '_filelineno', '_filename', '_files', '_inplace', '_isstdin', '_mode', '_openhook', '_output', '_readline', '_savestdout', '_startlineno', 'close', 'filelineno', 'filename', 'fileno', 'isfirstline', 'isstdin', 'lineno', 'nextfile', 'readline']
    >>>

    input方法的函数原型:

    fileinput.input(files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None)

    参数说明如下:

    files:                  #文件的路径列表,默认是stdin方式,多文件['1.txt','2.txt',...]
    inplace:                #是否将标准输出的结果写回文件,默认不取代,只能替换文件内容,不能增加内容
    backup:                 #备份文件的扩展名,只指定扩展名,如.bak。如果该文件的备份文件已存在,则会自动覆盖。
    bufsize:                #缓冲区大小,默认为0,如果文件很大,可以修改此参数,一般默认即可
    mode:                   #读写模式,默认为只读
    openhook:               #该钩子用于控制打开的所有文件,比如说编码方式等;

    input方法的说有参数都为关键字参数,在不带任何参数情况下,将使用命令行列出的所有文件(命令行参数列表:sys.argv[1:]),如果命令行也没有参数,则文件默认为 标准输入( sys.stdin),如果文件名为'-',也使用标准输入sys.stdin.。通常指定一个文件名列表作为input()方法的第一个参数,当然单个文件名也是允许的,也可以使用files=(‘file1‘,‘’file2‘’)格式传递文件名。下面是使用标准输入作为文件名的使用格式:

    import fileinput
    for line in fileinput.input():
        process(line)

    从3.2版本开始,fileinput实例可以用于上下文管理器,如:

    with fileinput.input(files=('spam.txt', 'eggs.txt')) as f:
        for line in f:
            process(line)

    特别注意:关键字参数 inplace=True的使用

    1、如果传递了inplace=True关键字参数,则标准输出会被重定向为打开的文件,但例外的的是:如果传入的文件为标准输入,则该替换功能自动被禁用。

    2、对于非标准输入文件,将用backup='.<some extension>'关键字指定的值(缺省为'.bak')作为扩展名重命名(相当于用linux的move命令)原文件,如果先前已经存在重命名的文件则直接无提示替换,同时自动将标准输出重定向为原输入文件,这就能够轻松的修改原文件,所以一定要用print打印到标准输出,如果没有用print打印到标准输出,就会把空内容回写到文件,也就是清除了文件所有内容。

    • fileinput模块的常用方法:

    input()         #模块的主要方法,返回能够用于for循环遍历的对象,该对象可迭代
    filename()   #返回当前正在读取的文件名,如果第一行被读取之前调用将返回None
    fileno()        #返回当前文件的文件描述符(1个整数),没有文件被打开(第一行之前或文件之间的时刻)将返回-1
    lineno()       #返回当前已经累加读取的行的数量(或者序号)
    filelineno()     #返回当前读取的行的行号,第一行读取之前返回0,最后文件的最后行被读取之后调用,将返回最后一行所在文件的行号
    isfirstline()     #检查当前行是否是所在文件的第一行,如果是则返回True,否则False
    isstdin()      #如果上一行是从sys.stdin(标准输入)读取的,则返回True,否则False

    nextfile()   #关掉当前文件以便从下个文件的第一行开始迭代读取

    单个文件内容简单替换:

    1 import fileinput
    2 for line in fileinput.input('test.txt',backup='.bak',inplace=1):  
    3     print line.replace('Python','LinuxEye'),
    4 fileinput.close()

    文件内容通过正则表达式查找替换,并将原文件备份:

    1 import fileinput
    2 import re
    3 obj_fileinput=fileinput.input(r'd:	est.txt',inplace=True,backup='.bak')
    4 for line in obj_fileinput:
    5     obj_re1 = re.compile(r'substitute', re.I | re.M)
    6     content= obj_re1.sub('substitute has been replace' , line)
    7     obj_re2 = re.compile(r'replace', re.I | re.M)
    8     print(obj_re2.sub('in place', content))
    9 fileinput.close()

    判断是否是第一行:

    1 import fileinput
    2 for line in fileinput.input(r'd:test.txt'):
    3     if fileinput.isfirstline():
    4         print(line)
    5     else:
    6         break
    7 fileinput.close()

    读取多个文件:

    1 import fileinput
    2 from glob import glob
    3 for line in fileinput.input(glob(r'd:*.txt')):
    4     print(fileinput.lineno(), u'文件:', fileinput.filename(), u'行号:', fileinput.filelineno())
    6 fileinput.close()

    从标准输入读取内容:

     1 import fileinput
     2 
     3 for line in fileinput.input():
     4     print(fileinput.lineno(),': ', line)
     6 fileinput.close()
  • 相关阅读:
    wsl手动启动特定的子系统
    winserver安装wsl
    wsl子系统下载地址-补充centos7地址
    wsl (1)-含wsl子系统各启动命令
    win10系统版本说明
    zenith 以及海康 rtsp流
    shinobi (4)
    ffmpeg
    CF993A Two Squares 几何 第二道 暴力或判断条件(*)
    CF994B Knights of a Polygonal Table 第一道 贪心 set/multiset的用法
  • 原文地址:https://www.cnblogs.com/dingbj/p/fileinput.html
Copyright © 2020-2023  润新知