Z.S.K.'s Records

python之fileinput使用

工作中我们经常需要直接修改源文件,当然,我们都被建议最好别在源文件上直接做修改,要做好时刻备份的习惯,特别是重要的配置文件,如果需要直接修改源文件的话,我们一般都是先把源文件读入脚本然后再重定向到目标文件,目标文件重命名,源文件备份,linux下的话使用awk/sed一条命令就能搞定,python中有一个文件处理模块fileinput,比较实用

fileinput

fileinput模块可以对一个或多个文件中的内容进行迭代、遍历等操作,fileinput原型函数如下:

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

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

常用方法

  • fileinput.input() #返回能够用于for循环遍历的对象
  • fileinput.filename() #返回当前文件的名称
  • fileinput.lineno() #返回当前已经读取的行的数量(或者序号)
  • fileinput.filelineno() #返回当前读取的行的行号
  • fileinput.isfirstline() #检查当前行是否是文件的第一行
  • fileinput.isstdin() #判断最后一行是否从stdin中读取
  • fileinput.close() #关闭队列

最常用的则为fileinput()方法,该方法按行读入文件,返回一个可迭代对象,使用for循环可遍历输出,这点类似于readline()

修改源文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def encrypt_passwd(_file):
#设置inplace=True则是通过通过下面的print重定向回源文件实现直接修改源文件
with fileinput.input(_file, inplace=True) as f:
#如果指定backup,则源文件被备份且重命名为源文件.bak
#with fileinput.input(_file, backup='.bak',inplace=True) as f:
for line in f:
if ('_DBPASSWD=' in line):
_passwd = line.split('=',1)[1].strip()
if ('pbkdf2:' not in _passwd):
en_passwd = encrypt(15,_passwd)
line = '_DBPASSWD=' + en_passwd
print(line,end='\n')
else:
print(line,end='')
else:
print(line,end='')

参考文章:

转载请注明原作者: 周淑科(https://izsk.me)


 wechat
Scan Me To Read on Phone
I know you won't do this,but what if you did?