要求:按照要求完成对文件的增、删、改、查操作。

def add(**kwargs):
'''新增内容,在指定位置新增'''
while True:
flag = False
with open("test",encoding="utf8") as f_read,\
open("test1",mode="w",encoding="utf8") as f_write:
for line in f_read:
if line.startswith("backend") and kwargs["backend"] in line:#匹配URL行
flag = True #设定开关
if kwargs["record"]["server"] in line \
and kwargs["record"]["weight"] in line \
and kwargs["record"]["maxconn"] in line \
and flag == True:#匹配服务器里详细信息位置
f_write.write(line)#写入原来的信息
f_write.write("\t\tserver %s %s weight %s maxconn %s"%\
(kwargs["record1"]["server"],kwargs["record1"]["server"],\
kwargs["record1"]["weight"],kwargs["record1"]["maxconn"]))#这是新增的内容
flag = False #合上开关
continue
f_write.write(line)#继续写其他的内容 def delete(**kwargs):
'''删除指定位置的文件'''
while True:
flag = False
with open("test",encoding="utf8") as f_read,\
open("test1",mode="w",encoding="utf8") as f_write:
for line in f_read:
if line.startswith("backend") and kwargs["backend"] in line :#匹配URL行
flag = True #设定开关
if kwargs["record"]["server"] in line \
and kwargs["record"]["weight"] in line \
and kwargs["record"]["maxconn"] in line \
and flag == True:#这是删除行的信息
flag = False
continue #跳过要删除的行,不写入
f_write.write(line)#继续写入其他的内容 def change(**kwargs):
'''修改指定位置的文件'''
while True:
flag = False
with open("test", encoding="utf8") as f_read, \
open("test1", mode="w", encoding="utf8") as f_write:
for line in f_read:
if line.startswith("backend") and kwargs["backend"] in line:#匹配URL行
flag = True
if kwargs["record"]["server"] in line \
and kwargs["record"]["weight"] in line \
and kwargs["record"]["maxconn"] in line \
and flag == True:#定位到指定的位置
f_write.write("\t\tserver %s %s weight %s maxconn %s"%\
(kwargs["record1"]["server"],kwargs["record1"]["server"],\
kwargs["record1"]["weight"],kwargs["record1"]["maxconn"]))#写入修改的信息
flag = False
continue#跳出本次循环,继续下次循环
f_write.write(line)#继续写入其他的内容 def query(choice):
'''查询想要的内容'''
while True:
flag = False
with open("test",encoding="utf8") as f_read,\
open("test1",mode="w",encoding="utf8") as f_write:
for line in f_read:
if line.startswith("backend") and choice in line :#匹配URL行信息
flag = True #设个开关
continue #跳出本次,继续下次
if line.startswith("backend") and flag :#匹配结束行的位置
flag = False #合上开关
break #退出循环
if flag:
f_write.write(line) #写入刚刚匹配到的内容,就完成了查询的目的 def tell_msg():
'''用户输入提示'''
msg = '''
1 新增
2 删除
3 修改
4 查询
'''
print(msg) cmd_dic = {#该子典根据用户输入的数字,也就是字典的key,调取key得到对应的value
"1":add,
"2":delete,
"3":change,
"4":query
} while True:
tell_msg()#调用输入提示函数
choice = input("please input choices:").strip()#输入要操作的数
if choice == "1" or choice == "3":#因为新增和修改要输入位置参数和要变更的参数,so,要输入两个信息
choice1 =eval(input("请以字典形式输入位置参数:"))
choice2 =eval(input("请以字典形式输入变更参数:"))
cmd_dic[choice](**choice1,**choice2)#通过用户输入的数,调取字典里的value用作函数名,调用相关函数
continue
if choice == "2" :
choice1 =eval(input("请以字典形式输入位置参数:"))
cmd_dic[choice](**choice1)
continue
if choice == "4":
choice1 = input("请输入域名参数:")
cmd_dic[choice](choice1)
continue
if choice == "q":#退出程序
print("ByeBye!")
break
else:#输入不对时,提示,继续循环
print("Do not have this option!")
continue

  当用户选择“1”时,用户输入的信息为:

{"backend": "www.oldboy20.org", "record": {"server": "10.10.0.10 10.10.0.10", "weight": "9999", "maxconn": "33"}}#输入的位置参数
{"record1":{"server":"1.1.1.1","weight":"2222","maxconn":"3333"}}#这是要新增的参数
------------------------以下是新增后的文件-----------------------
backend www.oldboy20.org
server 10.10.0.10 10.10.0.10 weight 9999 maxconn 33
  server 1.1.1.1 1.1.1.1 weight 2222 maxconn 3333

  当用户选择“2”时,用户输入的信息为:

{"backend":"www.oldboy1.org","record":{"server":"10.10.0.10 10.10.0.10","weight":"9999","maxconn":"33"}}#输入要删除的信息
------------------------以下删除后的文件-------------------------
backend www.oldboy1.org
server 10.10.10.1 10.10.10.1 weight 22 maxconn 2000
server 2.2.2.4 2.2.2.4 weight 20 maxconn 3000

  当用户选择“3”时,用户输入的信息为:

{"backend":"www.oldboy2.org","record":{"server":"3.3.3.3 3.3.3.3","weight":"20","maxconn":"3000"}}#位置参数信息
{"record1": {"server":"0000","weight":"0000", "maxconn":"0000"}}#要修改的参数信息
--------------------------以下是修改后的文件-------------------------
backend www.oldboy2.org
server 0000 0000 weight 0000 maxconn 0000

  当用户选择“4”时,用户输入的信息为:

www.oldboy1.org #输入要查询的url地址
-------------------以下是查询的结果文件----------------------
server 10.10.0.10 10.10.0.10 weight 9999 maxconn 33
server 10.10.10.1 10.10.10.1 weight 22 maxconn 2000
server 2.2.2.4 2.2.2.4 weight 20 maxconn 3000

  最后附上test原始文件:

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.oldboy1.org
server 10.10.0.10 10.10.0.10 weight 9999 maxconn 33
server 10.10.10.1 10.10.10.1 weight 22 maxconn 2000
server 2.2.2.4 2.2.2.4 weight 20 maxconn 3000 backend www.oldboy2.org
server 3.3.3.3 3.3.3.3 weight 20 maxconn 3000 backend www.oldboy20.org
server 10.10.0.10 10.10.0.10 weight 9999 maxconn 33

  

Python实战二的更多相关文章

  1. Python爬虫实战二之爬取百度贴吧帖子

    大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不 ...

  2. 转 Python爬虫实战二之爬取百度贴吧帖子

    静觅 » Python爬虫实战二之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 ...

  3. python实战--数据结构二叉树

    此文将讲述如何用python实战解决二叉树实验 前面已经讲述了python语言的基本用法,现在让我们实战一下具体明确python的用法 点击我进入python速成笔记 先看一下最终效果图: 首先我们要 ...

  4. 再一波Python实战项目列表

    前言: 近几年Python可谓是大热啊,很多人都纷纷投入Python的学习中,以前我们实验楼总结过多篇Python实战项目列表,不但有用还有趣,最主要的是咱们实验楼不但有详细的开发教程,更有在线开发环 ...

  5. python实战:用70行代码写了一个山炮计算器!

    python实战训练:用70行代码写了个山炮计算器! 好了...好了...各位因为我是三年级而发牢骚的各位伙伴们,我第一次为大家插播了python的基础实战训练.这个,我是想给,那些python基础一 ...

  6. python实战提升--1

    #python实战提升 1. 如何在列表.字典.集合中根据条件筛选数据? python中for _ in range(10)与for i in range(10)有何区别 下划线表示 临时变量, 仅用 ...

  7. 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程

    点击了解更多Python课程>>> 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程 适用人群: 即将毕业的大学生,工资低工作重的白领,渴望崭露头角的职场新人, ...

  8. Python实战案例系列(一)

    本节目录 烟草扫码数据统计 奖学金统计 实战一.烟草扫码数据统计 1. 需求分析 根据扫码信息在数据库文件中匹配相应规格详细信息,并进行个数统计 条码库.xls 扫码.xlsx 一个条码对应多个规格名 ...

  9. coreseek实战(二):windows下mysql数据源部分配置说明

    coreseek实战(二):windows下mysql数据源部分配置说明 关于coreseek在windows使用mysql数据源的配置,以及中文分词的详细说明,请参考官方文档: mysql数据源配置 ...

随机推荐

  1. python---issubclass/type/isinstance/ 反射(内置函数getattr/delattr...)

    # 一 python面向对象-内置函数(issubclass(), type(), isinstance()) # issubclass 判断xxxx类是否是xxxx类的子类 class egg: p ...

  2. 微服务之Spring cloud

    微服务 Spring cloud Spring Cloud provides tools for developers to quickly build some of the common patt ...

  3. D - Stone Division HackerRank - stone-division (博弈+搜索)

    题目链接:https://cn.vjudge.net/problem/HackerRank-stone-division 题目大意:给你n,m,然后是m个数.每一次你可以选择一个a[i],如果能被n整 ...

  4. #6284. 数列分块入门 8(区间询问等于一个数 cc 的元素,并将这个区间的所有元素改为 c)

    题目链接:https://loj.ac/problem/6284 题目大意:中文题目 具体思路:还是和sqrt那个题的思路相同的,标记每一块的值是不是相同的,注意lazy下标的下放. AC代码: #i ...

  5. java程序中默认整形值常量是什么类型的?如何区分不同类型的整型数值常量?

    java程序中默认整形值常量是什么类型的?如何区分不同类型的整型数值常量? 整数值默认就是int类型,只有在数值常量后面加“L”或“l”才表明该常量是long型

  6. Aizu 2170 Marked Ancestor

    题意:出一颗树,有两种操作:1. mark  u  标记结点u2.query  u  询问离u最近的且被标记的祖先结点是哪个让你输出所有询问的和. 思路:数据量太小,直接暴力dfs就可以了 #incl ...

  7. Windows防火墙配置(允许某个网段和部分IP访问某个端口)

    1.win+R 2.gpedit.msc 3.计算机配置+Windows设置+安全设置+IP安全策略,在本地计算机 4.创建IP安全策略 5.配置IP筛选器列表.筛选器操作 6.分配 192.168. ...

  8. 使用git和github管理自己的项目---基础操作学习[转]

    原文: https://segmentfault.com/a/1190000003728094 我是通过看廖雪峰的git教程学习的,真的是极好的,以下是我学习过程中的总结,记录下来,方便自己参考以熟悉 ...

  9. Iterables vs. Iterators vs. Generators

    Reprinted from: Iterables vs. Iterators vs. Generators Occasionally I've run into situations of conf ...

  10. rocketmq的name server启动时的jvm参数配置

    -Xms2g -Xmx2g -Xmn1g //设置年轻代大小 -XX:MetaspaceSize=128m //持久代的初始大小 -XX:MaxMetaspaceSize=320m //持久代的上限 ...