ha.txt文件内容:

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.baidu.org
server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
server 100.1.7.8 100.1.7.8 weight 20 maxconn 4000
backend www.baidu1.com
server 1.1.1.1 1.1.1.1 weight 20 maxconn 3000

操作代码ha.py:

import os
#查询
def fetch(data):
# 把整行作为一个整体,做成字符串拼接
# 相当于拼接backend www.baidu.com
#record存放返回的数据
backend_data = "backend %s" %data
record_list = [] #定义空列表
#打开文件
with open('ha.txt','r',encoding='utf8') as f:
#在报警期间,一直执行捕捉操作
tag = False#报警器,默认不响
for line in f: #查找backend记录
#找backend,比较的时候把\n去掉,用sttrip实现
if line.strip() == backend_data:#找到这行,在去除回车之后,是否等于backend
tag = True#警报响起
continue#backend这行不要,跳出本次循环,下次循环都要带着tag警报了
# 解除警报
# 警报亮着,并且满足再次匹配backend的时候
#警报不能放到最后,在抓最后一个人之前,要把警报关闭
if tag and line.startswith("backend"):
#tag = False # 解除警报,但是break之后什么变量都不生效了
break
#当tag=True的情况
#警报亮了,并且有数据进来。line在文件中可能是空行,再加一个and操作
if tag and line:
record_list.append(line.strip())#添加数据,每添加一行数据,就循环一次 #打印用户找到的信息
for line in record_list:
print(line)
return record_list#返回处理的信息 #添加
def add(data):
backend = data['backend']#获取
record_list = fetch(backend)#传递给fetch
#把用户输入的字典转换成server的模式
current_record = "server %s %s weight %s maxconn %s" %(data['record']['server'], \
data['record']['server'], \
data['record']['weight'], \
data['record']['maxconn']) backend_data = "backend %s" %backend#拼接字符串 #record_list为空的情况下,运行下面的代码
if not record_list:
#加入record里面
record_list.append(backend_data)#标题
record_list.append(current_record)#server记录
#打开源文件,打开新文件把源文件内容一行行写入新文件
with open("ha.txt",'r',encoding="utf-8") as read_file,\
open("ha_new.txt",'w',encoding='utf-8') as write_file:
#从源文件一行行读取内容
for r_line in read_file:
write_file.write(r_line)#新文件一行行写 #用户输入的内容
for new_line in record_list:#读
if new_line.startswith('backend'):#是backend开头的文件
write_file.write(new_line + '\n')#往新文件里写
else:#其余行
write_file.write("%s%s\n" %(" "*8,new_line))#8个空格,写
else:
#print(record_list)
#自己创造一个record_list,把添加的server添加进去,保留原记录
record_list.insert(0,backend_data)
if current_record not in record_list:#
record_list.append(current_record)#添加自己拼接的记录
#print("new record list %s" %record_list)#新拼接的列表
with open('ha.txt','r',encoding='utf-8') as read_file,\
open('ha_new.txt','w',encoding='utf-8') as write_file:
#警报
tag = False
has_write = False
for r_line in read_file:#源文件读
if r_line.strip() == backend_data:#拉响警报
tag = True
continue
#如果警报是响的并且是匹配到backend的情况
if r_line.strip() == backend_data:
tag = True
continue if not tag:#警报没有响
write_file.write(r_line)#一直往新文件里写
else:#警报响
if not has_write:#如果没有写的情况
for new_line in record_list:
if new_line.startswith('backend'):
write_file.write(new_line + '\n')
else:
write_file.write('%s%s\n' %(' '*8,new_line))
has_write = True#record_list不会写
os.rename('ha.txt','ha_bak.txt')
os.rename('ha_new.txt','ha.txt')
os.remove('ha_bak.txt')
#删除
def remove(data):
backend = data['backend']
record_list = fetch(backend)#查
current_record = "server %s %s weight %s maxconn %s" % (data['record']['server'],\
data['record']['server'],\
data['record']['weight'],\
data['record']['maxconn']) backend_data = "backend %s" % backend
#为空
if not record_list or current_record not in record_list:
print("\033[33;1m无此条记录\033[0m")
return #终止掉
else:
#处理record_list,存在,统一处理
record_list.insert(0,backend_data)#标题加进去
record_list.remove(current_record)#把用户删除的列表删掉
with open('ha.txt','r',encoding='utf-8') as read_file,\
open('ha_new.txt','w',encoding='utf-8') as write_file:
tag = False
has_write = False
for r_line in read_file:
if r_line.strip() == backend_data:
tag = True
continue
if tag and r_line.startswith('backend'):
tag = False
if not tag:
write_file.write(r_line)
else:
if not has_write:
for new_line in record_list:
if new_line.startswith('backend'):
write_file.write(new_line + '\n')
else:
write_file.write('%s%s\n' %(' '*8,new_line))
has_write = True
os.rename('ha.txt','ha_bak.txt')
os.rename('ha_new.txt','ha.txt')
os.remove('ha_bak.txt') def change(data):
#通过列表找到backend信息
backend = data[0]['backend']
record_list = fetch(backend)#找到backend信息 #改的数据,旧内容,新内容
old_record = "server %s %s weight %s maxconn %s" % (data[0]['record']['server'], \
data[0]['record']['server'], \
data[0]['record']['weight'], \
data[0]['record']['maxconn']) new_record = "server %s %s weight %s maxconn %s" % (data[1]['record']['server'], \
data[1]['record']['server'], \
data[1]['record']['weight'], \
data[1]['record']['maxconn']) backend_data = "backend %s" % backend #没有backend或者server信息不存在
if not record_list or old_record not in record_list:
print('\033[33;1m无此内容\033[0m')
return
else:
record_list.insert(0,backend_data)#重新生成record_list
index=record_list.index(old_record)#旧内容索引
record_list[index]=new_record#替换
with open('ha.txt', 'r', encoding='utf-8') as read_file, \
open('ha_new.txt', 'w', encoding='utf-8') as write_file:
tag = False
has_write = False
for r_line in read_file:
if r_line.strip() == backend_data:
tag = True
continue
if tag and r_line.startswith('backend'):
tag = False
if not tag:
write_file.write(r_line)
else:
if not has_write:
for new_line in record_list:
if new_line.startswith('backend'):
write_file.write(new_line + '\n')
else:
write_file.write('%s%s\n' % (' ' * 8, new_line))
has_write = True
os.rename('ha.txt', 'ha_bak.txt')
os.rename('ha_new.txt', 'ha.txt')
os.remove('ha_bak.txt') #代码运行的时候就会把__name__赋值给__main__
#如果把代码当做模块导入,__name__就会被赋值为文件名
if __name__ == '__main__':#系统内置变量
#用户提示信息
msg = '''
1:查询-fetch
2:添加-add
3:删除-remove
4:修改-change
5:退出-exit
'''
#定义字典,实现提示信息与上面函数的对应关系,数字:函数名,不能加(),加上就是运行结果
#key定义成字符串的形式
menu_dic = {
'1':fetch,
'2':add,
'3':remove,
'4':change,
'5':exit
}
#死循环,不断的跟用户去交互
#主逻辑
while True:
print(msg)
choice=input("操作>>:").strip()#用户选择
if choice == '2' or choice == '3':
print("实例:{'backend':'www.baidu1.com','record':{'server':'2.2.2.2','weight':20,'maxconn':3000}}")
if choice == '4':
print("实例(旧内容,新内容):[{'backend':'www.baidu1.com','record':{'server':'1.1.1.1','weight':20,'maxconn':3000}},{'backend':'www.baidu1.com','record':{'server':'2.2.2.2','weight':20,'maxconn':4000}}]")
#用户为空 or 用户超过可选范围
if len(choice) == 0 or choice not in menu_dic:continue#不在里面
if choice == '5':break #在用户输入完操作选项之后,输入
#data输入完之后,要把数据传入到上面的一个个功能,就是在函数名的地方加上data
#所以上面的所有函数都要有参数,在函数名的()内都要加上data #用户输入的是字典的话,转换成字符串赋值给data
data = input("数据>>:").strip() #如果用户输入不是1查询的话,因为默认是字符串的模式,所以要加引号
if choice != '1':
#在下面执行的时候,再通过eval转换成字典,最后赋值给add,或者del功能
data = eval(data)#把用户输入的字符串转换成字符串原本包含的格式,最终赋值给data #用户执行操作
#menu_dic[choice]==fetch
#menu_dic[choice]() == fetch()
# menu_dic[choice](data) == fetch(data)
#定义一个字典,通过字典的方式调用一个函数,这样函数名有变动,只要改字典的对应关系就可以了,这样主逻辑就不用动了
menu_dic[choice](data)

python处理ha文件的更多相关文章

  1. Python基础之文件处理、函数、内置函数 (三)

    内置函数 一 详细见python文档,请点击 文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 文件句柄 = file('文件路径', '模式') 注:python中打开 ...

  2. python基础之文件处理

    读和写文件 读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直 ...

  3. Python开发【第三篇】:Python基本之文件操作

    Python基本之文本操作 一.初识文本的基本操作 在python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open ...

  4. Python绘制PDF文件~超简单的小程序

    Python绘制PDF文件 项目简介 这次项目很简单,本次项目课,代码不超过40行,主要是使用 urllib和reportlab模块,来生成一个pdf文件. reportlab官方文档 http:// ...

  5. python基础之文件读写

    python基础之文件读写 本节内容 os模块中文件以及目录的一些方法 文件的操作 目录的操作 1.os模块中文件以及目录的一些方法 python操作文件以及目录可以使用os模块的一些方法如下: 得到 ...

  6. python批量进行文件修改操作

    python批量修改文件扩展名 在网上下载了一些文件,因为某种原因,扩展名多了一个后缀'.xxx',手动修改的话因为文件太多,改起来费时费力,于是决定写个小脚本进行修改. 1.要点: import r ...

  7. 关于Python中的文件操作(转)

    总是记不住API.昨晚写的时候用到了这些,但是没记住,于是就索性整理一下吧: python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Pyth ...

  8. Python基础、文件处理

    一.概述 Python中操作文件是通过file对象来处理的,步骤: 指定文件的路径.操作的模式 对文件进行操作,读或写操作 关闭文件对象 f = open( '文件路径','访问模式') # 打开文件 ...

  9. python os&shutil 文件操作

    python os&shutil 文件操作 # os 模块 os.sep 可以取代操作系统特定的路径分隔符.windows下为 '\\' os.name 字符串指示你正在使用的平台.比如对于W ...

随机推荐

  1. Atitit.java图片图像处理attilax总结

    Atitit.java图片图像处理attilax总结 BufferedImage extends java.awt.Image 获取图像像素点 image.getRGB(i, lineIndex); ...

  2. 可能是一场很 IN 的技术分享

    从去年的 Swift 到今年的 iOS 9,每一个新的技术.新的设备都"紧紧牵动 iOS 开发者的心". 好在有这样一群开发者,他们乐于第一时间尝试.挑战并分享. 有一类开发者他们 ...

  3. 彻底理解跨域解决方案JSONP

    什么是同源策略? 同源策略,它是由Netscape提出的一个著名的安全策略.现在所有支持JavaScript 的浏览器都会使用这个策略. 所谓同源是指,域名,协议,端口相同.当一个浏览器的两个tab页 ...

  4. SQL Server的日期和时间类型

    Sql Server使用 Date 表示日期,time表示时间,使用datetime和datetime2表示日期和时间. 1,秒的精度是指使用多少位小数表示秒 DateTime数据类型秒的精度是3,D ...

  5. 【转】中间代码opcode的执行

    原文链接:http://www.orlion.ga/941/ 原文:http://www.nowamagic.net/librarys/veda/detail/1543 假如我们现在使用的是CLI模式 ...

  6. java JFileChooser选择文件和保存文件

    //文件过滤器import java.io.File; import javax.swing.filechooser.FileFilter; public class MyFilter extends ...

  7. 初始化的一些问题(Vector使用)

    import java.util.Vector; import java.util.Iterator; import java.util.Arrays; import java.util.ArrayL ...

  8. JavaWeb:Web与HTTP协议简介

    JavaWeb:Web与HTTP协议简介 Web的概念 什么是Web: Web是网络上使用最广泛的分布式应用架构. 旨在共享分布在网络上的各个Web服务器中的所有互相连接的信息. 三个特征: 用HTM ...

  9. Elaticsearch REST API常用技巧

    在Elasticsearch的REST API中,有很多使用技巧,这里针对官方文档给出的介绍,总结了几个常用的例子. 更多内容参考:Elastisearch文档总结 多索引 ES支持在一次请求中指定多 ...

  10. [UWP]涨姿势UWP源码——IsolatedStorage

    前一篇涨姿势UWP源码分析从数据源着手,解释了RSS feed的获取和解析,本篇则会就数据源的保存和读取进行举例. 和之前的Windows Runtime一样,UWP采用IsolatedStorage ...