zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    Centos 7 zabbix 实战应用
    Centos7 Zabbix添加主机、图形、触发器
    Centos7 Zabbix监控部署
    Centos7 Ntp 时间服务器
    Linux 150命令之查看文件及内容处理命令 cat tac less head tail cut
    Kickstart 安装centos7
    Centos7与Centos6的区别
    Linux 150命令之 文件和目录操作命令 chattr lsattr find
    Linux 发展史与vm安装linux centos 6.9
    Linux介绍
  • 原文地址:https://www.cnblogs.com/dingbj/p/fileinput.html
Copyright © 2011-2022 走看看