需求,有一个配置文件test.conf内容如下

backend www1
server 1
server 2 backend www2
server 3
server 4 add
[{'backend':'www1','server':'3'}]
change
[{'backend':'www1','server':'1'},{'backend':'www1','server':'3'}]
delete
[{'backend':'www1','server':'1'}]

  1,自定义函数实现查询功能,查询需要根据用户输入的关键字进行查询如输入www1则查询出对应的下面的配置

  2,自定义函数实现添加功能,比如在关键字www1后面添加一个配置为server 3

  3,自定义函数实现修改功能,比如把server 1修改成 server 3

  4,自定义函数实现删除功能,比如把www1后面的server 1删除

  

  day21-1.py

def fetch(data):
print('这是查询函数,用户的输入是%s' %data) #data = 'www1'
backend_data = 'backend %s' %data #backend_data = 'backend www1'
#以只读方式打开文件如果遇到对应的关键行,这里的关键行是 backend www1则把标签置为True
#需要输出的是关键行和下一个关键行之间的数据,所以假如循环到下一个以backend开头的关键字则退出整个循环
#假如遇到查询的关键行并且还没有遇到下一个以backend开头的关键行则tag值为True打印两行之间的数据
#并且把数据追加到列表中作为返回值返回
with open('test.conf','r') as read_f:
tag = False
ret = []
for read_line in read_f:
if read_line.strip() == backend_data:
tag = True
continue
if tag and read_line.startswith('backend'):
break
if tag:
print(read_line,end='')
ret.append(read_line)
return ret #ret = [' server 1\n', ' server 2\n', '\n'] def add(data):
print('这是添加函数,用户输入的数据是%s' %data) #data = [{'backend':'www1','server':'3'}]
backend = data[0]['backend'] # backend = 'www1'
backend_data = 'backend %s' % backend # backend_data = 'backend www1'
res = fetch(backend) # res = [' server 1\n', ' server 2\n', '\n']
add_server_record = '%sserver %s\n' %(' '*4,data[0]['server']) #add_server_record = ' server 3\n'
if not res:
print('修改的数据不存在')
elif add_server_record in res:
print('需要修改的数据重复')
else:
res.insert(-1,add_server_record) #res = [' server 1\n', ' server 2\n', ' server 3\n','\n']
res.insert(0,'%s\n' %backend_data) #res = ['backend www1\n',' server 1\n', ' server 2\n', ' server 3\n','\n']
with open('test.conf','r') as read_f,open('test.conf_new','w') as wirte_f:
tag = False
has_write = False
for read_line in read_f:
if read_line.strip() == backend_data:
tag = True
continue
if read_line.startswith('backend'):
tag = False
if not tag:
wirte_f.write(read_line)
else:
if not has_write:
for record in res:
wirte_f.write(record)
has_write = True def change(data):
#data是一个特定格式的列表,前面包含了需要修改的旧数据的一个字典,后面包含了需要改成什么的字典
#因为input接收输入格式为字符串所以需要在输入数据的时候判定之前输入的选项如果不是1查询功能则需要把字符串通过eval函数方法转换成列表格式
print('这是修改函数,用户输入的数据是%s' % data) #data = [{'backend':'www1','server':'1'},{'backend':'www1','server':'3'}]
#根据列表及字典索引取出需要查询的关键字www1 作为查询函数fetch的参数
backend = data[0]['backend'] #backend = 'www1'
#根据需要查询的关键字加backend拼接出关键行
backend_data = 'backend %s' %backend #backend_data = 'backend www1'
#根据取出的关键字www1查询并且把结果返回给一个列表res 这个列表作为一会修改时需要写入文件的以后列表
res = fetch(backend) # res = [' server 1\n', ' server 2\n', '\n']
#根据用户输入取出需要修改的旧数据和需要修改成什么的新数据,需要加换行符\n
old_server_record = '%sserver %s\n' %(' '*4,data[0]['server']) #old_server_record = ' server 1\n'
new_server_record = '%sserver %s\n' %(' '*4,data[1]['server']) #old_server_record = ' server 3\n'
#判断调用查询函数fetch返回的列表res是否为空以及需要修改的旧数据是否在列表中,如果其中一条不成立及返回数据不存在
if not res or old_server_record not in res:
print('需要修改的数据不存在')
#如果满足以上条件res有返回值并且修改的旧数据在res里面则先找出就数据的索引然后根据索引把旧数据替换成需要修改的新数据
#因为res没有返回关键行的数据所以需要把关键行插入列表res中
else:
index = res.index(old_server_record) #index=0
res[index] = new_server_record #res = [' server 3\n', ' server 2\n', '\n']
res.insert(0,'%s\n' %backend_data) #res = ['backend www1\n',' server 3\n', ' server 2\n', '\n']
#以只读方式打开文件test.conf以写方式打开新文件test.conf_new并且定义两个补签tag和has_write
#tag补签用来识别是直接写原文件内容还是写新列表内容
#has_write补签用来识别列表内容是否已经写过一遍了,如果已经写过一遍就无需重复写入了
with open('test.conf','r') as read_f,open('test.conf_new','w') as write_f:
tag = False
has_write = False
for read_line in read_f:
if read_line.strip() == backend_data:
tag = True
continue
if tag and read_line.startswith('backend'):
tag = False
if not tag:
write_f.write(read_line)
else:
if not has_write:
for record in res:
write_f.write(record)
has_write = True def delete(data):
print('这是删除函数,用户输入的数据是%s' %data) #data = [{'server': '1', 'backend': 'www1'}]
backend = data[0]['backend'] # backend = 'www1'
backen_data = 'backend %s' % backend # backend_data = 'backend www1'
res = fetch(backend) # res = [' server 1\n', ' server 2\n', '\n']
del_server_record = '%sserver %s\n' % (' ' * 4, data[0]['server']) # del_server_record = ' server 1\n'
if not res or del_server_record not in res:
print('需要删除的内容不存在')
else:
res.remove(del_server_record) #res = [' server 2\n', '\n']
res.insert(0, '%s\n' % backen_data) #res = ['backend www1\n',' server 2\n', '\n']
with open('test.conf','r') as read_f,open('test.conf_new','w') as write_f:
tag = False
has_write = False
for read_line in read_f:
if read_line.strip() == backen_data:
tag = True
continue
if tag and read_line.startswith('backend'):
tag = False
if not tag:
write_f.write(read_line)
else:
if not has_write:
for record in res:
write_f.write(record)
has_write = True if __name__ == '__main__':
#定义需要显示的信息
msg = '''
1:查询
2:添加
3:修改
4:删除
5:退出
'''
#定义一个字典根据用户输入的选项以及输入的数据执行对应操作
msg_dic={
'1': fetch,
'2': add,
'3': change,
'4': delete
}
while True:
print(msg)
choice = input('请输入选项:')
#如果输入为空则退出本次循环重新输入
if choice == '':continue
#如果输入为5则退出程序
if choice == '5':break
data = input('请输入数据:')
#如果不是选项1执行操作则需要把输入的字符串类型转换成对应的列表类型
if choice != '1':
data = eval(data)
#根据用户输入的choic和data数据执行对应的函数
res = msg_dic[choice](data)
print('最终返回结果是%s' %res)

  

Python全栈day21(作业针对一个文件进行查询修改删除的操作练习)的更多相关文章

  1. python 全栈开发,Day26(hashlib文件一致性,configparser,logging,collections模块,deque,OrderedDict)

    一.hashlib文件一致性校验 为何要进行文件一致性校验? 为了确保你得到的文件是正确的版本,而没有被注入病毒和木马程序.例如我们经常在网上下载软件,而这些软件已经被注入了一些广告和病毒等,如果不进 ...

  2. Python全栈-day6-day7-字符编码和文件处理

    一.字符编码 1.编码基础 定义:人在使用计算机时,使用的是人类能够读懂的字符,使用者必须通过一张字符和数字间的相对应关系表实现人机交互,这一系列标准称为字符编码 Python应用中解决核心字符串乱码 ...

  3. 巨蟒python全栈开发-第8天 文件操作

    一.文件操作 今日大纲: 1.文件操作->open() open 打开 f=open(文件路径,mode='模式',encoding='编码格式') #python最最底层操作的就是bytes ...

  4. python学习之老男孩python全栈第九期_day009之文件操作总结

    # 文件处理# 打开文件# open('路径','打开方式', '指定编码方式')# 打开方式:r w a 可读可写:r+ 可写可读:w+ 可追加可读:a+ b# r+ :打开文件直接写,和读完再写 ...

  5. 【Python全栈-HTML】HTML引入文件的绝对路径、相对路径、根目录

    HTML引入文件的绝对路径.相对路径.根目录 什么是绝对路径?绝对路径指的是文件的真正路径,使用绝对路径链接外部资源,如:图片.超级链接.flash.音频.视频等等.代码如下: 1.引入网络上的资源: ...

  6. Python全栈day21(调用模块路径BASEDIR的正确方法)

    正常写python程序会有一个可执行的bin.py文件,假如这个文件需要导入my_module里面定义的模块,应该怎么设置sys.path 文件夹目录结构如下,因为bin不在与my_module同级目 ...

  7. Python全栈day21(函数的解耦)

    针对上一篇对文件的操作程序,执行一次操作的函数查询,添加,修改,删除都需要在函数里面定义文件处理的过程,整体函数看起来比较乱,代码重复过多 下面新定义一个函数专门用于处理文件操作,然后在不同的函数里面 ...

  8. python全栈开发day51-jquery插件、@media媒体查询、移动端单位、Bootstrap框架

    一.昨日内容回顾 技术行业 (1)ajax技术 XMLHttpRequest() <1>创建XMLHttpRequest()对象 <2>检测状态(通过readyState的改变 ...

  9. 巨蟒python全栈开发django7:多表增加和查询

    1.回顾内容&&补充 补充1: 补充2: 这个选择的是第二个解释器. 选择第一个的话,只是针对当前的项目,如果再开新项目的话,需要重新下载安装相关的包. 点击保存,因为我们注释掉了,创 ...

随机推荐

  1. Atitit.struts2体系结构大总结

    Atitit.struts2体系结构大总结 1. 国际化与异常处理 2 2. 第5章 拦截器 2 3. 第7章 输入校验 2 4. 避免表单重复提交与等待页面 2 5. Struts 2对Ajax的支 ...

  2. CYQ聊天遇到的问题

    action.Data["yj_id"].Value  用action.Get<int>("yj_id"); 这种写法安全 如果是代码里怎么判断,a ...

  3. 算法5-6:Kd树

    问题 给定一系列的点.和一个矩形.求矩形中包括的点的数量. 解答 这个问题能够通过建立矩阵来进行求解.首先将一个空间切割成矩阵,将点放置在相应的格子中.再计算矩形覆盖的格子.再推断格子中的点是否包括在 ...

  4. dubbo接口测试

    1.下载所需工具eclipse或intellij idea,下载maven,maven中config/settings.xml中要添加公司(测试人员公司)的maven库,不然被测dubbo服务jar包 ...

  5. Django接受ajax传过来的数组

    $.ajax({ cache: false, type: "POST", url: "/userdelete/", traditional:true, //加上 ...

  6. vim 笔记

    1.替换 :s/vivian/sky/ 替换当前行第一个 vivian 为 sky :s/vivian/sky/g 替换当前行所有 vivian 为 sky :%s/vivian/sky/(等同于 : ...

  7. [debootstrap]制作基于arm平台的debian文件系统

    之前用过的Linux文件系统是直接busybox制作的,而当前使用的是debian的Jessie,看了一些博客后,了解到如果使用debian,那么直接使用debootstrap来构建文件系统即可 -- ...

  8. php 的rabbitmq 扩展模块amqp安装

    php 的rabbitmq 扩展模块amqp安装 2017年10月08日 10:34:22 阅读数:240 使用PHP开发,要使用中间队列rabbitmq, 必须要安装PHP的扩展模块amqp, 服务 ...

  9. sql 使用整理

    今天使用视图查询东西,为了方便直接select * 查出来的都行全部都错乱了,看来sql 超过20个以上的字段为了效率和安全,禁止用select * -------------查一个表的所有字段的-- ...

  10. 【BZOJ】1643: [Usaco2007 Oct]Bessie's Secret Pasture 贝茜的秘密草坪(dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1643 这题和完全背包十分相似, 但是不能用1维做........原因貌似是不能确定块数(还是有0的面 ...