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. angularjs学习曲线

    angularjs学习曲线 刚开始学Augular觉得开发应用需要有相当的编程基础. 不得不说这确实是一款了不起的开发框架,它要求开发人员设计低耦合和可维护的应用. 使用AngularJS 的复杂度就 ...

  2. KnockoutJS 3.X API 第五章 高级应用(5) 使用预处理扩展Knockout绑定语法

    注意:这是一种高级技术,通常仅在创建可重用绑定或扩展语法的库时使用. 这不是你通常需要做的时候使用Knockout构建应用程序. 从Knockout 3.0开始,开发人员可以通过提供在绑定过程中重写D ...

  3. [转] SSH原理与运用(2):远程操作与端口转发

    英文:阮一峰 链接:http://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html 接着前一次的文章,继续介绍SSH的用法. (Imag ...

  4. php优点

    PHP,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP:Hypertext Preprocessor)的缩写.PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本 ...

  5. php技术之路

    按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定 ...

  6. PHP的学习--PHP的闭包

    php的闭包(Closure)也就是匿名函数,是PHP5.3引入的. 闭包的语法很简单,需要注意的关键字就只有use,use是连接闭包和外界变量. $a = function() use($b) {} ...

  7. Spark入门实战系列--3.Spark编程模型(下)--IDEA搭建及实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 . 安装IntelliJ IDEA IDEA 全称 IntelliJ IDEA,是java语 ...

  8. [C] 关于表达式求值

    结论是:在一个表达式中,如果两个相邻操作符的执行顺序由它们的优先级决定,如果它们的优先级相同,它们的执行顺序由它们的结合性决定.若出现前述规则描述之外的情形,编译器可以自由决定求值的顺序(只要不违反逗 ...

  9. javascript学习4

    JavaScript Date(日期)对象 日期对象用于处理日期和时间. JavaScript Date(日期)对象 实例 返回当日的日期和时间 如何使用 Date() 方法或者当日的日期. getT ...

  10. JS魔法堂: Native Promise Only源码剖析

    一, 前言 深入学习Promise的朋友应该都看过<深入理解Promise五部曲>这一系列的文章, 以解除回调地狱之外的观点来剖析Promise更多的内涵,确实十分精彩. Part 1: ...