一、打开文件 open()函数
open函数返回一个文件对象。
用法:open('文件名','模式')
打开文件的模式有:
- r,只读模式(默认)。
- w,只写模式。【不可读;不存在则创建;存在则删除内容;】
- a,追加模式。【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
- r+,可读写文件。【可读;可写;可追加】
- w+,写读
- a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
- rU
- r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
- rb
- wb
- ab
二、操作文件 读和写
read(5): 读取5个字节的数据(包括空格与换行),如果没有参数,则是读取尽量多的字节,甚至整个文件,放到一个字符串中
readline():没有参数,一次读取一行数据(包括换行符),放到一个字符串中
readlines():读取所有行(包括换行符),每行放到一个字符串,所有行组成一个字符串列表
write():将一个字符串写进文件
writelines():将一个字符串列表写进文件
三、关闭文件 close()
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
with open('file1','r') as file_obj: file_obj.readlines()
四、几种读取文件方法的比较
#/usr/bin/env python # -*- coding: utf-8 -*- import fileinput import sys import re #方法一: #迭代一个或多个文件的所有行,不是将所有行读到列表,而是创建一个xreadlines对象 for x in fileinput.input(sys.argv[1:]): print x print "==========" #方法二: #读取一个文件的所有行到列表,然后再迭代列表,比较耗内存,大文件不建议这样做 with open("file","r") as file_obj: for i in file_obj.readlines(): print i print "=============" #方法三: #直接迭代文件对象,跟方法二一样,也是读取一个文件的所有行到列表,然后再迭代列表 with open("file","r") as file_obj: for i in file_obj: print i print "==========" #方法四: #readline() 一次读取一行 with open("file","r") as file_obj: L= file_obj.readline() while L: print L L= file_obj.readline() print "=========="
五、修改配置文件示例
原配置文件
global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 local2 info defaults log global mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms option dontlognull listen stats :8888 stats enable stats uri /admin stats auth admin:1234 frontend oldboy.org bind 0.0.0.0:80 option httplog option httpclose option forwardfor log global acl www hdr_reg(host) -i www.oldboy.org use_backend www.oldboy.org if www backend www.oldboy.org server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
需求
1、查 输入:www.oldboy.org 获取当前backend下的所有记录 2、新建 输入: arg = { 'bakend': 'www.oldboy.org', 'record':{ 'server': '100.1.7.9', 'weight': 20, 'maxconn': 30 } } 3、删除 输入: arg = { 'bakend': 'www.oldboy.org', 'record':{ 'server': '100.1.7.9', 'weight': 20, 'maxconn': 30 } }
demo
#!/usr/bin/env python # -*- coding:utf-8 -*- import json import os ##获取backend记录 def fetch(backend): backend_title = 'backend %s' % backend record_list = [] #用于存储所有记录 with open('haproxy.cfg') as obj: #obj是一个文件对象 flag = False for line in obj: #文件是一个可迭代对象 line = line.strip() #去掉行首和行尾的空格和换行符 if line == backend_title: flag = True continue if flag and line.startswith('backend'): #遇到下一个'backend'字段退出 startswith('backend')表示以backend开头 flag = False break if flag and line: #flag为真且line为真 record_list.append(line) return record_list ##添加backend记录 def add(dict_info): backend = dict_info.get('backend') #获取'backend'的值 record_list = fetch(backend) #获取当前的backend记录 backend_title = "backend %s" % backend current_record = "server %s %s weight %d maxconn %d" % (dict_info['record']['server'], dict_info['record']['server'], dict_info['record']['weight'], dict_info['record']['maxconn']) if not record_list: #如果bakend记录不存在 record_list.append(backend_title) record_list.append(current_record) with open('haproxy.cfg') as read_file, open('ha.new', 'w') as write_file: #with支持同时对多个文件的上下文进行管理 flag = False for line in read_file: write_file.write(line) #写入字符串 for i in record_list: #列表是可迭代对象 if i.startswith('backend'): write_file.write(i+'\n') else: write_file.write("%s%s\n" % (8*" ", i)) #8*" " 表示8个空格 else: record_list.insert(0, backend_title) #在列表指定下标前插入元素 if current_record not in record_list: #成员资格,序列通用方法 record_list.append(current_record) #append() 列表追加 with open('haproxy.cfg') as read_file, open('ha.new', 'w') as write_file: #open()如果没有模式参数,默认为r ,能以w模式打开不存在的文件(新建) flag = False has_write = False for line in read_file: line_strip = line.strip() if line_strip == backend_title: flag = True continue if flag and line_strip.startswith('backend'): flag = False if not flag: write_file.write(line) else: if not has_write: for i in record_list: # if i.startswith('backend'): write_file.write(i+'\n') else: write_file.write("%s%s\n" % (8*" ", i)) has_write = True os.rename('haproxy.cfg','ha.bak') os.rename('ha.new','haproxy.cfg') ##删除backend记录 def remove(dict_info): backend = dict_info.get('backend') record_list = fetch(backend) backend_title = "backend %s" % backend current_record = "server %s %s weight %d maxconn %d" % (dict_info['record']['server'], dict_info['record']['server'], dict_info['record']['weight'], dict_info['record']['maxconn']) if not record_list: #如果record_list为空 return else: if current_record not in record_list: #如果输入的record不存在 return else: del record_list[record_list.index(current_record)] #index返回列表元素的下标 #del删除列表元素 if len(record_list) > 0: #如果backend记录为0,则把backend删除 record_list.insert(0, backend_title) with open('haproxy.cfg') as read_file, open('ha.new', 'w') as write_file: flag = False has_write = False for line in read_file: line_strip = line.strip() if line_strip == backend_title: flag = True continue if flag and line_strip.startswith('backend'): flag = False if not flag: write_file.write(line) else: if not has_write: for i in record_list: if i.startswith('backend'): write_file.write(i+'\n') else: write_file.write("%s%s\n" % (8*" ", i)) has_write = True os.rename('haproxy.cfg','ha.bak') os.rename('ha.new','haproxy.cfg') if __name__ == '__main__': #只有当本文件被执行时,才满足__name__=='__main__' print('1,get;2,add;3,del') num=input('input number:') data=input('input content:') if num == '1': content=fetch(data) #content是一个列表 print(''.join(content)) # join方法将序列拼接成字符串 分隔符默认为一个空格 else: dict_data = json.loads(data) # 此处json.loads将字典模样的字符串变成字典 if num == '2': add(dict_data) elif num == '3': remove(dict_data) else: pass