文件名为message,文件内容如下:

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 101.1000.7.9 101.1000.7.9 weight 20 maxconn 30
server 2.2.2.7 2.2.2.7 weight 30 maxconn 4000
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 33333333333

要求:对message文件中的backend内容进行查询、修改、添加和删除操作

(其中修改操作为:server 2.2.2.4 2.2.2.4 weight 20 maxconn 3000修改为server 2.2.2.5 2.2.2.5 weight 30 maxconn 4000

[{'backend':'www.oldboy1.org','record':{'server':'2.2.2.4','weight':20,'maxconn':3000}},{'backend':'www.oldboy1.org','record':{'server':'2.2.2.5','weight':30,'maxconn':4000}}]

程序及其分析如下:

 import os
def inquire(data): #对文件信息进行查询函数
print('欢迎使用查询功能')
backend_data ='backend %s'%data #对输入的data进行拼接,使得www.oldboy1.org==>backend www.oldboy1.org
with open ('message', 'r', encoding='utf-8') as open_file: #打开文件
tag = False #设置一个状态,通过状态来标志一种操作
res = []
for target in open_file: #对文件内容进行遍历
if backend_data == target.strip(): #判断:输入的data是否与文件内容相匹配(文件每一行内容后默认有一个换行符。通过strip函数去掉)
tag = True #一旦找到匹配信息,tag状态发生改变,查询到信息,执行后续打印操作
continue
if tag and target.startswith('backend'): #在tag状态发生改变并且再一次遇到新的backend信息内容时,标志着所查询内容结束
break
if tag:
print(target,end='')
res.append(target)
return res
def modify(data): #对文件信息进行修改函数
print('欢迎使用修改功能')
print('您要修改的记录为%s修改结果为%s'%(data[0],data[1]))
backend = data[0]['backend']
backend_data ='backend %s'%backend
old_record_data = '%sserver %s weight %s maxconn %s\n'%(' '*8,data[0]['record']['server'], #修改前server数据处理,将字典拼接成字符串
data[0]['record']['weight'],
data[0]['record']['maxconn'])
new_record_data = '%sserver %s weight %s maxconn %s\n ' % (' ' * 8, data[1]['record']['server'], #修改后server数据处理,将字典拼接成字符串
data[1]['record']['weight'],
data[1]['record']['maxconn'])
res = inquire(backend) #修改前进行查询,判断修改的记录是否存在
if not res or old_record_data not in res: #修改记录不存在(backend信息不存在或者backend信息存在但server信息不存在)
print('您修改的记录不存在')
else: #以下是通过索引对查询出的列表内容进行修改
index = res.index(old_record_data)
res[index] = new_record_data
res.insert(0, '%s\n' % backend_data)
with open('message', 'r') as read_file,\ #以下是对文件内容进行修改(以读的方式打开message文件,并创建一个新文件messag_new)
open('message_new', 'w') as write_file:
tag = False
had_write = False
for read_line in read_file: #对文件进行遍历
if read_line.strip() == backend_data:
tag = True
continue
if tag and read_line.startswith('backend'):
tag = False
if not tag: #如果没有遇到修改信息,原文件直接写入新文件
write_file.write(read_line)
else: #如果遇到修改信息,将刚才修改过的列表内容遍历写入新文件
if not had_write:
for target in res:
write_file.write(target)
had_write = True
os.rename('message','message_old') #通过对文件重新命名的方式,用修改过的文件覆盖未修改的文件
os.rename('message_new','message')
os.remove('message_old')
return
def add(data):
print('欢迎使用添加功能')
print('您要添加的数据是%s'%data)
def delete(data):
print('欢迎使用删除功能')
print('您要删除的数据是%s'%data)
if __name__ == '__main__': #python程序的入口
retrieve_information = '''
1:查询
2:修改
3:添加
4:删除
5:退出
''' #设置检索信息
retrieve_information_dic = {
'':inquire,
'':modify,
'':add,
'':delete,
}
while True: #用户循环输入操作
print(retrieve_information)
choice = input('请输入您想要执行操作的序号==>').strip()
if not choice:continue
if choice == '':break
data = input('请输入信息==>').strip()
if choice != '': #输入信息为字符串,如果是查询操作,不需要对信息进行处理
data = eval(data)
res = retrieve_information_dic[choice](data) #调用想要的函数,并将返回值赋给res
print(res)

我们在写程序的时候,要注意吧一个功能封装为一个函数。

一是有利于程序的可读性

二是有利于程序可移植性

我们在上述程序中发现,在对文件进行查询和修改操作过程中,存在大量文件操作,

我们把其中文件操作的程序单独拿出来,定义一个文件处理的函数

其实这就是文件的解耦

数据之间的耦合带来的最大问题就是可读性很差,一堆程序,不知道要表达什么意思

修改后的程序如下:

 import os
def file_handler(backend_data, res = None ,type = 'inquire'): #新增加了文件处理函数
if type == 'inquire':
with open('message', 'r', encoding='utf-8') as open_file:
tag = False
res = []
for target in open_file:
if backend_data == target.strip():
tag = True
continue
if tag and target.startswith('backend'):
break
if tag:
print(target, end='')
res.append(target)
return res
elif type == 'modify':
with open('message', 'r') as read_file, \
open('message_new', 'w') as write_file:
tag = False
had_write = False
for read_line in read_file:
if read_line.strip() == backend_data:
tag = True
continue
if tag and read_line.startswith('backend'):
tag = False
if not tag:
write_file.write(read_line)
else:
if not had_write:
for target in res:
write_file.write(target)
had_write = True
os.rename('message', 'message_old')
os.rename('message_new', 'message')
os.remove('message_old')
def inquire(data):
print('欢迎使用查询功能')
backend_data ='backend %s'%data
return file_handler(backend_data) #直接调用文件处理函数即可
def modify(data):
print('欢迎使用修改功能')
print('您要修改的记录为%s修改结果为%s'%(data[0],data[1]))
backend = data[0]['backend']
backend_data ='backend %s'%backend
old_record_data = '%sserver %s weight %s maxconn %s\n'%(' '*8,data[0]['record']['server'],
data[0]['record']['weight'],
data[0]['record']['maxconn'])
new_record_data = '%sserver %s weight %s maxconn %s\n ' % (' ' * 8, data[1]['record']['server'],
data[1]['record']['weight'],
data[1]['record']['maxconn'])
res = inquire(backend)
if not res or old_record_data not in res:
print('您修改的记录不存在')
else:
index = res.index(old_record_data)
res[index] = new_record_data
res.insert(0, '%s\n' % backend_data)
file_handler(backend_data,res = res,type = 'modify')
def add(data):
print('欢迎使用添加功能')
print('您要添加的数据是%s'%data)
def delete(data):
print('欢迎使用删除功能')
print('您要删除的数据是%s'%data)
if __name__ == '__main__':
retrieve_information = '''
1:查询
2:修改
3:添加
4:删除
5:退出
'''
retrieve_information_dic = {
'':inquire,
'':modify,
'':add,
'':delete,
}
while True:
print(retrieve_information)
choice = input('请输入您想要执行操作的序号==>').strip()
if not choice:continue
if choice == '':break
data = input('请输入信息==>').strip()
if choice != '':
data = eval(data)
res = retrieve_information_dic[choice](data)
print(res)

虽然程序长短没什么变化,可是可读性变好了许多

Python(27)--文件相关处理的应用(增、删、改、查)的更多相关文章

  1. 好用的SQL TVP~~独家赠送[增-删-改-查]的例子

    以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化.  本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...

  2. iOS FMDB的使用(增,删,改,查,sqlite存取图片)

    iOS FMDB的使用(增,删,改,查,sqlite存取图片) 在上一篇博客我对sqlite的基本使用进行了详细介绍... 但是在实际开发中原生使用的频率是很少的... 这篇博客我将会较全面的介绍FM ...

  3. iOS sqlite3 的基本使用(增 删 改 查)

    iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...

  4. django ajax增 删 改 查

    具于django ajax实现增 删 改 查功能 代码示例: 代码: urls.py from django.conf.urls import url from django.contrib impo ...

  5. ADO.NET 增 删 改 查

    ADO.NET:(数据访问技术)就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 ADO.NET所有数据访 ...

  6. MVC EF 增 删 改 查

    using System;using System.Collections.Generic;using System.Linq;using System.Web;//using System.Data ...

  7. python基础中的四大天王-增-删-改-查

    列表-list-[] 输入内存储存容器 发生改变通常直接变化,让我们看看下面列子 增---默认在最后添加 #append()--括号中可以是数字,可以是字符串,可以是元祖,可以是集合,可以是字典 #l ...

  8. 简单的php数据库操作类代码(增,删,改,查)

    这几天准备重新学习,梳理一下知识体系,同时按照功能模块划分做一些东西.所以.mysql的操作成为第一个要点.我写了一个简单的mysql操作类,实现数据的简单的增删改查功能. 数据库操纵基本流程为: 1 ...

  9. Django(十)模型:django模型类对数据库的:增/删/改/查、自关联、管理器、元选项(指定表名)

    一.插入.更新和删除 调用一个模型类对象的save方法的时候就可以实现对模型类对应数据表的插入和更新. 调用一个模型类对象的delete方法的时候就可以实现对模型类对应数据表数据的删除. 二.自关联 ...

  10. js数组的管理[增,删,改,查]

    今天在设计表单的时候遇到对数组的一些处理的问题,比如说怎么创建一个数组,然后牵扯到数组的增删改查的方法.请看API FF: Firefox, N: Netscape, IE: Internet Exp ...

随机推荐

  1. 2018.10.27 loj#6035. 「雅礼集训 2017 Day4」洗衣服(贪心+堆)

    传送门 显然的贪心题啊...考试没调出来10pts滚了妙的一啊 直接分别用堆贪心出洗完第iii件衣服需要的最少时间和晾完第iii件衣服需要的最少时间. 我们设第一个算出来的数组是aaa,第二个是bbb ...

  2. 线性回归,多项式回归(P2)

    回归问题 回归问题包含有线性回归和多项式回归 简单来说,线性回归就是用多元一次方程拟合数据,多项式回归是用多元多次来拟合方程 在几何意义上看,线性回归拟合出的是直线,平面.多项式拟合出来的是曲线,曲面 ...

  3. JAVA技术路线2

    https://www.zhihu.com/question/56110328 1.JavaSE学习视频 http://pan.baidu.com/s/1bp3g6rd2.javaweb的学习视频 h ...

  4. DocumentFragment类型

    nodeType 11 nodeName #document-fragment nodeValue NULL parentNode null createdocumentfragment()方法创建了 ...

  5. 学python之路前的一些话

    为什么学python: 这些年一直从事运维相关的工作.但做下来感觉都是些很基础的东西,无非就是对一些命令或者问题处理很熟练而已,混的都是经验.曾很羡慕会写shell脚本,会自动化安装程序的运维组组长, ...

  6. Java学习第1天:序言,基础及配置tomcat

    所谓是福不是祸,是祸躲不过,到底还是回到java的阵地上来.既然它这么热,那就学学它,现在这件事已经提上议事日程,也已经开始. 今天做的事: 泛泛的翻了几本书,敲了一些练习代码,比如字符串操作,接口等 ...

  7. ibatis.net之我的调整:Update语句的动态set字段

    动态Update语句 如果Map中指定多个字段 <update id="UpdateStaff"> update Staff set Name=#Name#,InDat ...

  8. How to transfer developer profile to one mac to another mac

    Export developer profile from old mac. In the Xcode Organizer, select your team in the Teams section ...

  9. java基础-day24

    第01天 java基础加强 今日内容介绍 u Junit单元测试及反射概述 u 反射操作构造方法.成员方法.成员属性 u properties的基本操作 u 综合案例 第1章   Junit单元测试及 ...

  10. lca tarjin

    这个算法  我个人认为是  遍历每一个点把它当成一些询问的最近祖先 1 2 3 4 5 6 low是并差集,vis是是否访问过,访问过为true,没有为false: 假设询问是(4,4),(4,5), ...