在构建一个程序项目之前,首先需要设计程序的框架,从总体上构建一个项目中的一个个功能,之后对每一个功能进行补充,最终实现总体的功能。

1 程序的总体框架:

首先把所有的功能设计成相应的函数,用pass来实现。

def add(operation):
"增加"
pass def remove(operation):
"删除"
pass def change(operation):
"更改"
pass if __name__ == '__main__':
msg ="""
1.查找
2.增加
3.删除
4.更改
5.退出
"""
# 通过定义字典,在输入序号时,能够对应相应的函数
msg_dict={
"1":serach,
"2":add,
"3":remove,
"4":change,
"5":exit
} while True:
print(msg)
usr_choice = input("请输入要进行的操作>>:").strip()
if len(usr_choice) == 0 or usr_choice not in msg_dict : continue # 用户输入为空,或者超出字典的内容,继续输入
if usr_choice == '5':
break operation = input("请输入要操作的内容>>:").strip() msg_dict[usr_choice](operation) # 通过字典调用函数,并传入参数operation

1.1 查询函数实现

查找是首先匹配到相应的行,判断开始和结束的位置,这里是通过标志位进行控制的。

def serach(operation):
"查找"
# pass
# serach_line = "backend %s" % operation # 查找的内容之情有backend,把输入的内容和backend进行拼接
# 还可以通过if line.strip().startwith("backend") and operation in line
search_list =[] # 将查找到的内容存放到此列表中
search_flag = False # 读取到匹配行时打开此flag
with open("haproxy.conf",encoding="utf-8") as f_read: # 打开文件,默认读操作
for line in f_read: # 逐行读取文件
# if line.strip() == serach_line: # 将匹配到每一行去掉换行,
if line.strip().startswith("backend") and operation in line: # 匹配到相应的行
search_flag = True # 匹配到后标志位为True
continue # 跳过匹配的行,操作的是下一行的内容
if line.strip().startswith("backend") and search_flag: # 判断结束行,需要放在search_flag之前
break
# search_flag = False
if search_flag:
search_list.append(line.strip()) # 将匹配的内容存储到列表中,同时删除换行符
for i in search_list:
print(i)
return search_list # 返回值是获取到的内容的列表

1.2 文件内容的增加操作

对文件的增加操作涉及了输入一个字典内容,但是实际在输入的过程中,输入的是字符串,这里用到eval()函数,能够将输入的字典形式的内容转换成字典的格式。

对文件进行修改,必然会创建一个新的文件。在这里采用的是把原来的文件中内容一行行读取并写入到新的文件中,最后把新文件的名字改成原来文件的名字。

def add(operation):
"增加,增加内容存在的情况(可以通过search()函数进行查询),增加内容不存在的情况"
# pass
backend_url = operation["backend"] # 获取输入的字典中的backend的value
record_list = serach(backend_url) #将获取到的url传递给search函数,search函数的返回值是search_list[],并赋值
backend_data = "backend %s" %backend_url # 将获取的URL同backend进行字符串的拼接
# 组成 backend www.oldboyX.org # 用户输入的内容格式:
# {"backend":"www.oldboy.org","record":{"server":"1.1.1.1","weight":"3000","maxconn":"33333"}}
# 获取输入的字典的内容并进行字符串的拼接
dict_string = "sever %s weight %s maxconn %s" %(operation["record"]["server"],\
operation["record"]["weight"],\
operation["record"]["maxconn"],
)
if not record_list: # 这是record_list中不存在查询的内容的情况,需要进行写入
record_list.append(backend_data) # 首先对record_list进行添加 backend www.oldboyX.org
record_list.append(dict_string) # 添加具体的server weight maxconn 信息
with open("haproxy.conf",encoding="utf-8") as file_read,\
open("haproxy_new.conf","w+",encoding="utf-8") as file_write:
# 读取源文件的内容写入到新的文件中,并写入添加的内容
for line_read in file_read: # 遍历源文件的每一行内容
file_write.write(line_read) # 逐行写入新的文件 for new_line in record_list:
if new_line.startswith("backend"): # 判断新的内容是backend时,写入并换行
file_write.write(new_line+"\n")
else:
file_write.write("%s%s\n" %(" "*8,new_line))
import os
os.rename("haproxy.conf","haproxy_bak.conf") # 将源文件备份
os.rename("haproxy_new.conf","haproxy.conf") # 将新文件重命名

1.3 文件内容的删除操作

文件删除是在文件内容查询的基础进行修改的

def remove(operation):
"删除"
# pass
backend_url = operation["backend"] # 获取输入的字典中的backend的value
record_list = serach(backend_url) # 将获取到的url传递给search函数,search函数的返回值是search_list[],并赋值
backend_data = "backend %s" % backend_url # 将获取的URL同backend进行字符串的拼接
# 组成 backend www.oldboyX.org # 用户输入的内容格式:
# 删除以下的内容
# {"backend":"www.oldboy20.org","record":{"server":'10.10.0.10.10.10.0.10',"weight":9999,"maxconn":333}}
# 获取输入的字典的内容并进行字符串的拼接
dict_string = "sever %s weight %s maxconn %s" % (operation["record"]["server"], \
operation["record"]["weight"], \
operation["record"]["maxconn"],
)
if not record_list : # 没有backend的情况 和 有backend 但是下面的内容不存在的情况
print("没有需要删除的内容")
return
else:
record_list.insert(0,backend_data) # 把拼接的backend信息插入到list中 with open("haproxy.conf",encoding="utf-8") as file_read,\
open("haproxy_new.conf","w+",encoding="utf-8") as file_write:
# 读取源文件的内容写入到新的文件中,并写入添加的内容
tag = False
flag_write = False
for r_line in file_read:
if r_line == backend_data:
tag = True
continue
if tag and r_line.startswith("backend"):
tag = False
if not tag:
file_write.write(r_line)
else:
if not flag_write:
for new_line in record_list:
if new_line.startswith("backend"):
file_write.write(new_line+"\n")
else:
file_write.write("%s%s\n" % (" " * 8, new_line)) os.rename("haproxy.conf", "haproxy_bak.conf") # 将源文件备份
os.rename("haproxy_new.conf", "haproxy.conf") # 将新文件重命名

1.4 文件内容的修改

haproxy文件的增删改查的更多相关文章

  1. 对haproxy文件进行增删改查

    1.文件内容 global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 local2 info defaults log global ...

  2. 【练习】Python第四次:实现对文件的增删改查

    一,实现对文件的增删改查 (一),三级菜单的处理结构及退出技巧:使用TAG标记 tag=True while tag: print('leve1') choice=input("level1 ...

  3. Python文件操作-文件的增删改查

    需求:对文件进行增删改查 由于时间原因,本次代码没有增加任何注释,如有疑问,请联系编辑者:闫龙 其实我也是醉了,看着这些个代码,我脑袋也特么大了,没办法,大神说了,不让用新知识,只可以使用学过的,所以 ...

  4. MyBatis学习(二)、SQL语句映射文件(2)增删改查、参数、缓存

    二.SQL语句映射文件(2)增删改查.参数.缓存 2.2 select 一个select 元素非常简单.例如: <!-- 查询学生,根据id --> <select id=" ...

  5. java对xml文件做增删改查------摘录

    java对xml文件做增删改查 package com.wss; import java.io.File;import java.util.ArrayList;import java.util.Lis ...

  6. MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存

    目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...

  7. 基于SpringMVC的文件(增删改查)上传、下载、更新、删除

    一.项目背景 摘要:最近一直在忙着项目的事,3个项目过去了,发现有一个共同的业务,那就是附件的处理,附件包括各种文档,当然还有图片等特殊文件,由于时间的关系,每次都是匆匆忙忙的搞定上线,称这项目的空档 ...

  8. 使用dom4j对xml文件进行增删改查

    1.使用dom4j技术对dom_demo.xml进行增删改查 首选要下载dom4j的jar包 在官网上找不到,网上搜索了一下在这个链接:http://sourceforge.net/projects/ ...

  9. Python 模拟SQL对文件进行增删改查

    #!/usr/bin/env python # _*_ coding:UTF-8 _*_ # __auth__: Dalhhin # Python 3.5.2,Pycharm 2016.3.2 # 2 ...

随机推荐

  1. Linux useradd 添加用户

    在 linux 中,如果我们想添加一个用户,那么使用的命令如下: 用户管理命令: useradd 基础的命令 命令名称:useradd 命令的所在路径:/usr/bin/useradd 执行权限:ro ...

  2. 安装APK时SO库的选择策略

    此文已由作者尹彬彬授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 0X0 前言 在Android系统中,当我们安装apk文件的时候,lib目录下的so文件会被解压到app的原 ...

  3. js 调用栈机制与ES6尾调用优化介绍

    调用栈的英文名叫做Call Stack,大家或多或少是有听过的,但是对于js调用栈的工作方式以及如何在工作中利用这一特性,大部分人可能没有进行过更深入的研究,这块内容可以说对我们前端来说就是所谓的基础 ...

  4. Codeforces - 65D - Harry Potter and the Sorting Hat - 简单搜索

    https://codeforces.com/problemset/problem/65/D 哈利波特!一种新思路的状压记忆化dfs,记得每次dfs用完要减回去.而且一定是要在dfs外部进行加减!防止 ...

  5. 序列化框架MJExtension详解 + iOS ORM框架

    当开发中你的模型中属性名称和 字典(JSON/XML) 中的key 不能一一对应时, 或者当字典中嵌套了多层字典数组时..., 以及教你如何用 MJExtension 配置类来统一管理你的模型配置, ...

  6. 简单介绍Git两种拉取代码的方式

    first: 1.通过git clone 命令克隆git库中的项目 注意:通过 git clone方式克隆的代码会在服务器上自动建一个与git库名相同的文件夹,所以有两种思路,第一种就是直接在wwwr ...

  7. lightoj 1088【树状数组+离散化】

    题意: 给你n个数,然后给你q个区间,然后问你这n个数有多少个在这个区间上: 思路: 树状数组搞搞,但是注意到数的范围很大,所以先离散化一下. 初始化初始化!!!卧槽,wa的我好郁闷... #incl ...

  8. 条件运算符?:接受三个操作数,是C#中唯一的三元运算符(转)

    int i = 10; int j = i == 10 ? 1 : 2; //转换成if选择结果如下 if (i == 10) { j = 1; } else { j = 2; } 需要根据还可以嵌套 ...

  9. Codeforces Round #547 (Div. 3) B.Maximal Continuous Rest

    链接:https://codeforces.com/contest/1141/problem/B 题意: 给n个数,0代表工作,1代表休息,求能连续最大的休息长度. 可以连接首尾. 思路: 求普通连续 ...

  10. centOS 部署服务器(三)

    今天一个新的项目终于能够重新安装mysql了,分享下步骤: 1.下载地址:http://dev.mysql.com/downloads/mysql/  (选择Linux - Generic版本的Lin ...