Python(27)--文件相关处理的应用(增、删、改、查)
文件名为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)--文件相关处理的应用(增、删、改、查)的更多相关文章
- 好用的SQL TVP~~独家赠送[增-删-改-查]的例子
以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化. 本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...
- iOS FMDB的使用(增,删,改,查,sqlite存取图片)
iOS FMDB的使用(增,删,改,查,sqlite存取图片) 在上一篇博客我对sqlite的基本使用进行了详细介绍... 但是在实际开发中原生使用的频率是很少的... 这篇博客我将会较全面的介绍FM ...
- iOS sqlite3 的基本使用(增 删 改 查)
iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...
- django ajax增 删 改 查
具于django ajax实现增 删 改 查功能 代码示例: 代码: urls.py from django.conf.urls import url from django.contrib impo ...
- ADO.NET 增 删 改 查
ADO.NET:(数据访问技术)就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 ADO.NET所有数据访 ...
- MVC EF 增 删 改 查
using System;using System.Collections.Generic;using System.Linq;using System.Web;//using System.Data ...
- python基础中的四大天王-增-删-改-查
列表-list-[] 输入内存储存容器 发生改变通常直接变化,让我们看看下面列子 增---默认在最后添加 #append()--括号中可以是数字,可以是字符串,可以是元祖,可以是集合,可以是字典 #l ...
- 简单的php数据库操作类代码(增,删,改,查)
这几天准备重新学习,梳理一下知识体系,同时按照功能模块划分做一些东西.所以.mysql的操作成为第一个要点.我写了一个简单的mysql操作类,实现数据的简单的增删改查功能. 数据库操纵基本流程为: 1 ...
- Django(十)模型:django模型类对数据库的:增/删/改/查、自关联、管理器、元选项(指定表名)
一.插入.更新和删除 调用一个模型类对象的save方法的时候就可以实现对模型类对应数据表的插入和更新. 调用一个模型类对象的delete方法的时候就可以实现对模型类对应数据表数据的删除. 二.自关联 ...
- js数组的管理[增,删,改,查]
今天在设计表单的时候遇到对数组的一些处理的问题,比如说怎么创建一个数组,然后牵扯到数组的增删改查的方法.请看API FF: Firefox, N: Netscape, IE: Internet Exp ...
随机推荐
- js文件中获取${pageContext.request.contextPath}
一般从 JSP文件中,可以直接使用 ${pageContext.request.contextPath}非常方便的获得当前页面的路径,用来处理被 Apache2代理之后出现 URL变化的问题,比如增加 ...
- 2018.10.24 NOIP模拟 小 C 的宿舍(分治)
传送门 分治妙题. 没有这道题的暴力分今天又垫底了啊233 由于用了分治的方法,我们只用考虑左区间对右区间的贡献以及右区间对左区间的贡献. 可以发现如果从中点开始向两边递推最小值并用这个区间最小值来推 ...
- xml 转 数组
function xml_to_array($xml){ if(!$xml){ return false; } //将XML转为array //禁止引用外部xml实体 libxml_disable_e ...
- s4-3 CSMA
载波侦听多路访问协议 CSMA:Carrier Sense Multiple Access 特点:"先听后发" 改进ALOHA协议的侦听/发送策略 分类 非持续式 持 ...
- 深入浅出javascript(三)封装和继承
一.私有变量和公有变量 通过var修饰的是私有变量. 二.私有变量的访问方法 三.特权.公有和私有方法 一个例子: function f(name) { var name=name; //私有变量 t ...
- Update Node.js Package.json
Update the latest package while using node.js, follow the command as following. npm i -g npm-check-u ...
- Alpha阶段敏捷冲刺(七)
1.站立式会议 提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 祁泽文:用java完成了错词,已掌握,陌生单词的图标生 ...
- spring启动component-scan类扫描加载,以及@Resource,postConstruct等等注解的解析生效源码
spring里IOC的原理就不详细写了, 如果想要搞清楚自动扫描组件是如何实现的,还有@Resouce @PostConstruct等注解的工作原理,最好可以先搞清楚整个IOC容器的运作原理再来分析这 ...
- Apache Flink 漫谈系列
阿里云讲Flink的,还是蛮不错 https://yq.aliyun.com/articles/666043?spm=a2c4e.11153940.blogcont679659.23.9fae56e7 ...
- 主题模型之概率潜在语义分析(Probabilistic Latent Semantic Analysis)
上一篇总结了潜在语义分析(Latent Semantic Analysis, LSA),LSA主要使用了线性代数中奇异值分解的方法,但是并没有严格的概率推导,由于文本文档的维度往往很高,如果在主题聚类 ...