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 ...
随机推荐
- [zhuan]SQLServer查询最近一天,三天,一周,一月,一季度方法
三天 select * from T_news where datediff(day,addtime,getdate())<= 2 and datediff(day,addtime,getdat ...
- C++STL priority_queue
priority_queue优先级队列 最大值优先级队列(队头是最大值) 最小值优先级队列(队头是最小值) priority_queue<int> q1;//默认定义为最大值优先级队列 ...
- gj13 asyncio并发编程
13.1 事件循环 asyncio 包含各种特定系统实现的模块化事件循环 传输和协议抽象 对TCP.UDP.SSL.子进程.延时调用以及其他的具体支持 模仿futures模块但适用于事件循环使用的Fu ...
- 20171126--fragment的小项目
1.在使用fragment时候,初始化的时候报了两个错误,解决方法如下文所示:https://www.2cto.com/kf/201706/650158.html 其实一共报了两个错误: androi ...
- X Window(远程桌面)
X Window在位映射屏幕上的一个或多个窗口中运行程序.用户可以在每个窗口中同时运行多个程序,并且可以通过用鼠标在窗口之间进行切换. x服务器的程序在本地工作站上运行,并且管理它的窗口和程序. 每个 ...
- Forward团队-爬虫豆瓣top250项目-需求分析
一. 需求:1.爬取豆瓣电影top250. 2.获取电影名称,排名,分数,简介,导演,演员. 3.将爬取到的数据保存,以便随时查看. 3.可以将获取到的数据展示给用户. 二. 参考: 豆瓣api参考资 ...
- 中国移动物联网平台数据转发 c# 控制台程序
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...
- noip第23课作业
1. 营救 铁塔尼号遇险了!他发出了求救信号.距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里. 通过侦测,哥伦比亚号获取了一张海洋图.这张图将海洋部分分化成n*n个比较小的单位,其 ...
- Windows 8.1 Update中的小改变
在Build 2014大会中,发布了Windows 8.1 Update的更新,并将于4月8日通过Windows Update进行推送.但是,在MSDN订阅下载中,带有该更新的镜像已经可以在4月3号放 ...
- hdu 5072 两两(不)互质个数逆向+容斥
http://acm.hdu.edu.cn/showproblem.php?pid=5072 求n个不同的数(<=1e5)中有多少组三元组(a, b, c)两两不互质或者两两互质. 逆向求解,把 ...