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 ...
随机推荐
- Codeforces 1111 简要题解
文章目录 A题 B题 C题 D题 E题 传送门 A题 传送门 题意简述:把262626个英文字母分成两类A,BA,BA,B,AAA类字符可以转成AAA类字符,BBB类字符可以转成BBB类字符,问给出的 ...
- Java日期时间使用总结[转载]
Java日期时间使用总结 一.Java中的日期概述 日期在Java中是一块非常复杂的内容,对于一个日期在不同的语言国别环境中,日期的国际化,日期和时间之间的转换,日期的加减运算,日期的展示格式 ...
- 一类n阶微分方程转1阶微分方程组
- 解决python代码中含有中文报错
python中写入中文时报错如下图所示: 依照网上解决方法:在py文件中加入:#encoding=utf-8 然后继续报错如下图所示: 解决方法: 在py文件中加入: import sysreload ...
- 解决Oracle+Mybatis批量插入报错:SQL 命令未正确结束
Mybatis批量插入需要foreach元素.foreach元素有以下主要属性: (1)item:集合中每一个元素进行迭代时的别名. (2)index:指定一个名字,用于表示在迭代过程中,每次迭代到的 ...
- const修饰指针时应注意的问题
1.指向常量的指针 顾名思义,一个指针指向const对象,则称它为指向常量的指针. ; int* ptr=&a; //错误 const int* ptr=&a; //必须用const来 ...
- ELK简单部署
系统环境: IP:192.168.0.156 ruby环境准备 yum -y install ruby-devel ruby-libs ruby-rdoc ruby-ri ruby-static ru ...
- maven打包某个分支的包
maven打某个分支的包命令: mvn clean install -Dmaven.test.skip=true -Pdevelop
- Kafka错误“Network is unreachable”和“larger than available brokers”
确定Kafka安装和启动正确,ZooKeeper可以查到所有的Brokers,但执行: kafka-topics.sh --create --zookeeper localhost:2181 --re ...
- Swift:用UICollectionView整一个瀑布流
本文的例子和Swift版本是基于Xcode7.2的.以后也许不知道什么时候会更新. 我们要干点啥 用新浪微博的Open API做后端来实现我们要提到的功能.把新浪微博的内容,图片和文字展示在colle ...