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 ...
随机推荐
- python中的特殊成员
python中的特殊成员: 小甲鱼论坛总结
- 2018.11.05 NOIP模拟 相交(dfs序+bit)
传送门 又TMTMTM考原题真是服. 考虑到两条路径相交一定满足某一条的lcalcalca在另外一条路径上面. 于是分开统计有多少个lcalcalca在当前路径上面以及有多少个路径经过了当前的lcal ...
- 2018.11.02 洛谷P3952 时间复杂度(模拟)
传送门 惊叹考场dubuffdubuffdubuff. 这题还没有梭哈难啊233. 直接按照题意模拟就行了. 代码: #include<bits/stdc++.h> using names ...
- 2018.11.01 NOIP训练 cost数(搜索+容斥原理)
传送门 唉考试的时候忘记剪倍数的枝了666666分滚粗. 其实就是一直取lcmlcmlcm搜索,然后容斥原理统计就行了. 代码
- 2018.06.27Dual Core CPU(最小割)
Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 26136 Accepted: 11270 Cas ...
- FontAwesome 4.7.0 中完整的675个图标样式CSS参考
FontAwesome 4.7.0 中完整的675个图标样式CSS参考 用法:首先引入CSS文件:<link href="https://maxcdn.bootstrapcdn.com ...
- vim 查找替换批量替换
一.vi查找: 当你用vi打开一个文件后,因为文件太长,如何才能找到你所要查找的关键字呢?在vi里可没有菜单-〉查找, 不过没关系,你在命令模式下敲斜杆(/)这时在状态栏(也就是屏幕左下脚)就出 ...
- i2c触摸屏驱动文件的实现
转自:http://blog.chinaunix.net/uid-29507718-id-4314013.html Linux下I2C接口触摸屏驱动分析 分类: LINUX linux下触摸屏驱动的 ...
- ArcGIS的地理坐标系与大地坐标系
一直以来,总有很多朋友针对地理坐标系.大地坐标系这两个概念吃不透.近日,在网上看到一篇文章介绍它们,非常喜欢.所以在此转发一下,希望能够对制图的朋友们有所帮助. 地理坐标:为球面坐标. 参考平面地是 ...
- 常用模块xml,shelve,configparser,hashlib
XML 什么XML:全称 可扩展标记语言 标记指的是代表某种含义的字符 XML<> 为什么需要XML 为能够在不同的平台间继续数据的交换 为了使交换的数据能让对方看懂 就需要按照一定的语法 ...