文件操作实践(一)
来源:互联网 发布:恢复删除照片软件 编辑:程序博客网 时间:2024/06/06 13:05
简介
利用Python的文件操作命令和函数功能,实现 :
1、获取ha记录
2、增加ha记录
3、删除ha记录
文件内容
global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 local2 infodefaults log global mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms option dontlognulllisten stats :8888 stats enable stats uri /admin stats auth admin:1234frontend 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 wwwbackend www.oldboy.org server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000 server 100.1.7.10 100.1.7.9 weight 20 maxconn 3000 server 100.1.7.11 100.1.7.9 weight 20 maxconn 3000backend buy.oldboy.org server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000原配置文件如上现增加ha配置文件为:
实践一
import jsondef read_haproxy(backend_str, f1): """ 查找、获取记录 :param backend_str: 输入的backend :param f1: 文件句柄 :return: """ backend_str = "backend " + backend_str result = 0 for line in f1: if backend_str.strip() == line.strip(): line_str = f1.readline() result = 1 while line_str.startswith(" server"): print(line_str) line_str = f1.readline() return resultdef add_haproxy(str, f1, f2): """ 增加记录 :param str: 记录语句 :param f1: 文件句柄 :param f2: 文件句柄 :return: """ read_dict = json.loads(str) # n = json.loads(s) # 将一个字符串,转换成python的基本数据类型; 注意:字符串形式的字典'{"k1":"v1"}'内部的字符串必须是 双引号 backend_title = read_dict['backend'] server = read_dict['record']['server'] weight = read_dict['record']['weight'] maxconn = read_dict['record']['maxconn'] new_str = " server {} weight {} maxconn {}".format(server, weight, maxconn) result = 0 for line in f1: if ("backend " + backend_title).strip() == line.strip(): print("backend is already exist") result = 1 # 针对已存在了的backend,如果下一级record也存在,则继续;如果不存在则追加新Node(record) if result == 1 and new_str.strip() == line.strip(): print("record is already exist") result = 2 if result == 1 and not len(line.strip()): print("到了backend 的结尾") if result != 2: print("结尾追加新Node(record)") f2.write("{}\n".format(new_str)) result = -1 f2.write(line) return result, new_strwith open('haproxy', 'r+', encoding='utf-8')as f1, open('haproxy_change', 'w', encoding='utf-8')as f2: input_code = input("命令:\n1、获取ha记录\n2、增加ha记录\n3、删除ha记录") if input_code == "1": back_end = input("请输入backend:") acquire_result = read_haproxy(back_end, f1) if acquire_result == 0: print("没有该backend记录") elif input_code == "2": add_new_line = input("请输入要增加的新backend记录:") # {"backend": "test.oldboy.org","record":{"server": "100.1.7.9 100.1.7.90","weight": 20,"maxconn": 30}} # {"backend": "www.oldboy.org","record":{"server": "100.1.7.10 100.1.7.9","weight": 20,"maxconn": 3000}} # {"backend": "www.oldboy.org","record":{"server": "110.1.7.10 100.1.7.9","weight": 20,"maxconn": 3000}} # {"backend": "buy.oldboy.org","record":{"server": "100.1.7.90 100.1.7.90","weight": 20,"maxconn": 3000}} # {"backend": "buy.oldboy.org","record":{"server": "100.1.7.100 100.1.7.90","weight": 20,"maxconn": 3000}} add_result, new_str = add_haproxy(add_new_line, f1, f2) if add_result == 0: print("可以增加新backend记录") read_dict = json.loads(add_new_line) backend_title = read_dict['backend'] new_backend = "\nbackend {}".format(backend_title) f2.write(new_backend) f2.write("\n{}".format(new_str)) else: pass
查询操作
增加操作
结果:
如果都已经存在:
如果下级record不存在:
增加后的文档:
实践二
特点在于只使用了两种状态的flag,先从简单逻辑写起,再复杂实现。使用了内存列表read_result,将record.strip() in read_result进行判断记录和复写。
import jsonimport shutildef fetch(backend): # backend = "www.oldboy.org" with open("haproxy", 'r', encoding="utf-8") as f: result = [] flag = False for line in f: if line.strip().startswith("backend") and line.strip() == "backend " + backend: print("当前所在backend %s 开头" % backend) flag = True continue # 表示下面的不执行,进入下次迭代,不过修改了flag = True if line.strip().startswith("backend") and flag: print("读到下个backend了") break if not line.strip() and flag: print("读到了空白行") break if flag and line.strip(): print("读到server了") result.append(line.strip()) return resultdef add_backend(backend, record): read_result = fetch(backend) # backend不存在 if not read_result: print("正增加新backend...") with open("haproxy", 'r', encoding='utf-8') as old_f, open("haproxy_new", 'w', encoding='utf-8') as new_f: for line in old_f: new_f.write(line) new_f.write("\n{}\n".format(backend)) new_f.write(record) else: # backend已存在 print("backend已存在") if record.strip() in read_result: # backend 和 record 都已存在 print("backend 和 record 都已存在") shutil.copy("haproxy", 'haproxy_new') # 拷贝一份 else: # backend存在,但record不存在 print("backend存在,但record不存在") read_result.append(record.strip()) flag = False with open("haproxy", 'r', encoding='utf-8') as old_f, open("haproxy_new", 'w', encoding='utf-8') as new_f: for line in old_f: if line.strip() == "backend " + backend and line.strip().startswith("backend"): print("-->>当前所在backend %s 开头" % backend) flag = True new_f.write(line) for new_record in read_result: new_f.write("{}{}\n".format(" " * 8, new_record)) continue # 表示记录了当前行,跳过下面语句,否则会重写一行 if flag and not line.strip(): flag = False print("-->>读到空白了") new_f.write(line) continue if not flag: print("-->>读到其他") new_f.write(line)command = input("命令:\n1、获取ha记录\n2、增加ha记录\n3、删除ha记录")if command == "1": put_backend = input("请输入要获取的backend:") # backend = "www.oldboy.org" "buy.oldboy.org" ret = fetch(put_backend) print("\n".join(ret))elif command == "2": # {"backend": "test.oldboy.org","record":{"server": "100.1.7.9 100.1.7.90","weight": 20,"maxconn": 30}} # {"backend": "www.oldboy.org","record":{"server": "100.1.7.10 100.1.7.9","weight": 20,"maxconn": 3000}} # {"backend": "www.oldboy.org","record":{"server": "110.1.7.10 110.1.7.9","weight": 20,"maxconn": 3000}} # {"backend": "buy.oldboy.org","record":{"server": "100.1.7.90 100.1.7.90","weight": 20,"maxconn": 3000}} # {"backend": "buy.oldboy.org","record":{"server": "100.1.7.100 100.1.7.100","weight": 20,"maxconn": 3000}} put_backend = input("请输入要增加的backend:") dict_backend = json.loads(put_backend) # str转换为字典 bk = dict_backend['backend'] rd = "{}server {} weight {} maxconn {}".format(" " * 8, dict_backend['record']['server'], dict_backend['record']['weight'], dict_backend['record']['maxconn']) add_backend(bk, rd)
实践三
特点是,增加backend时不需要用到fecth进行全部的扫描,只需要读一行,判断一行,写一行。
import jsonimport shutildef fetch(backend): # backend = "www.oldboy.org" with open("haproxy", 'r', encoding="utf-8") as f: result = [] flag = False for line in f: if line.strip().startswith("backend") and line.strip() == "backend " + backend: print("当前所在backend %s 开头" % backend) flag = True continue # 表示下面的不执行,进入下次迭代,不过修改了flag = True if line.strip().startswith("backend") and flag: print("读到下个backend了") break if not line.strip() and flag: print("读到了空白行") break if flag and line.strip(): print("读到server了") result.append(line.strip()) return resultdef add2(backend, record): with open('haproxy', 'r', encoding='utf-8') as old, open('new.conf', 'w', encoding='utf-8') as new: in_backend = False has_backend = False has_record = False for line in old: if line.strip().startswith('backend') and line.strip() == "backend " + backend: print("已存在backend") has_backend = True in_backend = True new.write(line) continue if in_backend and not line.strip(): print("in_backend的结尾为空白行") if not has_record: print("没有record") new.write(record + '\n') # 先写record, new.write(line) # 再写当前的空白行 in_backend = False continue if in_backend and line.strip() == record.strip(): print("backend和record都已存在") has_record = True new.write(line) continue new.write(line) if not has_backend: # 写backend,写record print("backend不存在,正在增加...") new.write('\nbackend ' + backend + '\n') new.write(record + '\n')command = input("命令:\n1、获取ha记录\n2、增加ha记录\n3、删除ha记录")if command == "1": put_backend = input("请输入要获取的backend:") # backend = "www.oldboy.org" "buy.oldboy.org" ret = fetch(put_backend) print("\n".join(ret))elif command == "2": # {"backend": "test.oldboy.org","record":{"server": "100.1.7.9 100.1.7.90","weight": 20,"maxconn": 30}} # {"backend": "www.oldboy.org","record":{"server": "100.1.7.10 100.1.7.9","weight": 20,"maxconn": 3000}} # {"backend": "www.oldboy.org","record":{"server": "110.1.7.10 110.1.7.9","weight": 20,"maxconn": 3000}} # {"backend": "buy.oldboy.org","record":{"server": "100.1.7.90 100.1.7.90","weight": 20,"maxconn": 3000}} # {"backend": "buy.oldboy.org","record":{"server": "100.1.7.100 100.1.7.100","weight": 20,"maxconn": 3000}} put_backend = input("请输入要增加的backend:") dict_backend = json.loads(put_backend) # str转换为字典 bk = dict_backend['backend'] rd = "{}server {} weight {} maxconn {}".format(" " * 8, dict_backend['record']['server'], dict_backend['record']['weight'], dict_backend['record']['maxconn']) add2(bk, rd)
阅读全文
0 0
- 文件操作实践(一)
- 文件操作(一)
- 文件操作(一)
- PowerShell 2.0 实践(一)操作文件系统
- PowerShell 2.0 实践(一)操作文件系统
- PowerShell 2.0 实践(一)操作文件系统
- pycharm实践操作(一)
- Linux文件操作(一)
- java文件操作(一)
- Linux文件操作(一)
- python 文件操作(一)
- C++文件操作(一)
- Java文件操作(一)
- linux文件操作(一)
- Linux文件操作(一)
- Python 文件操作(一)
- 文件操作总结(一)
- Python 文件操作(一)
- 日历控件
- 《算法图解》的选择排序的python和java实现
- imx6使用tftp下载kernel
- redis 中对key的命令操作
- 编译安装MySQL出现的问题
- 文件操作实践(一)
- 【C#】var关键字
- Oracle | 给表和字段添加注释
- Spring事务学习笔记(二)
- HDU-1166 敌兵布阵
- HDU1542 POJ1151矩形面积合并(线段树+离散化)
- 剑指offer第11题(二进制中1的个数)
- rocketmq jmeter压测
- 一篇面经(BAT面试)