#!/usr/bin/env python3

 import json             #json模块,用于将像字典的字符串转换为字典
import re #re模块,查找替换
import shutil #copy文件用
shutil.copyfile('conf','conf.bak') #shutil.copyfile(文件1,文件2):不用打开文件,直接用文件名进行覆盖copy。
#全局变量函数
def env():
    global user_dic,insert_addr,server,weight,maxconn,insert_conf,rec,ser,wei,max #global定义全局变量,这样函数外也能调用该变量
user_dic = json.loads(user_input) # 将用户输入类似字典字符串转换为字典
insert_addr = list(user_dic.items())[0][0] + ' ' + list(user_dic.items())[0][1] # 将用户输入信息第一个keys和values取出来
rec = list(user_dic.keys())[1]
ser = list(user_dic[rec].keys())[0]
wei = list(user_dic[rec].keys())[1]
max = list(user_dic[rec].keys())[2]
if rec in user_dic.keys():
if ser in user_dic[rec].keys():
server = user_dic[rec][ser]
if wei in user_dic[rec].keys():
weight = user_dic[rec][wei]
if max in user_dic[rec].keys():
maxconn = user_dic[rec][max]
insert_conf = '%s %s %s %s %s %s %s' % (ser, server, server, wei, weight, max, maxconn) # 将信息格式化
else:
print('输入有误')

env


 #将文件加入列表函数
def list_lines():
    global lines
with open('conf.bak', 'r') as f:
for line in f:
f.seek(0) # 文件指针指定为0开始
lines = f.readlines() # 将文件每行读取到列表lines中,包括换行符\n和缩进\t。

 #判断是否是json格式函数
def check_json_format():
    try:
json.loads(user_input,encoding='utf-8') #检测user_input是否是json格式,不是则异常
except ValueError: #异常报错,如没有异常这条永远不走
return False #异常报错返回False
return True #没有异常返回True
 #判断字符串是否为数字函数

 def isnub(s):
    try:
nb = float(s) #将字符串转换成数字成功则返回True
return True
except ValueError as e:
return False #如果出现异常则返回False

 #索引值是否存在函数
def if_index():
    try:
lines.index(insert_index)
return False
except ValueError:
return True
 #判断输入不能为空
def if_else():
    if len(user_input) == 0:
print('输入不能为空,请重新输入!')
return True
else:
print('输入有误,请输入json格式字符串!')
return False
 #输出文件变化
def change():
    with open('conf', 'r') as f:
print('修改之前:')
for line in f:
if insert_addr in line:
print(line + next(f))
with open('conf', 'r') as f:
print('修改之后:')
for line in f:
if insert_addr in line:
print(line + next(f) + next(f))
 #配置文件增加函数
def increase_conf():
    global user_input,insert_index
while True:
user_input = input('输入要增加配置文件内容:').strip()
if check_json_format() and isnub(user_input) == False: #如果json判断函数返回True,则为json格式
env()
list_lines()
if insert_addr+'\n' in lines:
insert_index = lines.index(insert_addr+'\n') # 获取insert_addr+\n在列表lines中的索引位置
if if_index():
lines.insert(insert_index + 2, ' ' + insert_conf + '\n') # 在列表中指定索引位置插入信息
with open('conf', '+w') as conf:
conf.write(''.join(lines)) # join将列表内容写入文件中以''隔开,也可以以'\n'隔开
print('已将%s添加到conf文件中'%(insert_conf))
change()
return True
else:
print('%s在conf文件中不存在'%(insert_addr))
return False
else:
print('%s在conf文件中不存在'%(insert_addr))
return False
if if_else():
continue
else:
continue
 #配置文件删除函数
def del_conf():
   global user_input,insert_index
while True:
user_input = input('请输入需要删除配置信息:').strip()
if check_json_format() and isnub(user_input) == False: # 如果json判断函数返回True,则为json格式
env()
list_lines()
if insert_addr + '\n' in lines:
if ' '+insert_conf+'\n' in lines:
insert_index = lines.index(' '+insert_conf+'\n')
if if_index():
del[lines[insert_index]]
with open('conf', '+w') as conf:
conf.write(''.join(lines)) # join将列表内容写入文件中以''隔开,也可以以'\n'隔开
return True
else:
print('%s %s %s %s %s %s %s在文件conf中不存在'%(ser, server, server, wei, weight, max, maxconn))
continue
else:
# print('%s不存在conf中'%(insert_conf))
print('%s %s %s %s %s %s %s在文件conf中不存在' % (ser, server, server, wei, weight, max, maxconn))
continue
else:
print('%s在文件conf中不存在'%(insert_addr))
continue
if if_else():
continue
else:
continue
 #配置文件修改函数
def modify_conf():
   global user_input
while True:
user_input = input('请输入需要修改的内容:').strip()
if check_json_format() and isnub(user_input) == False: # 如果json判断函数返回True,则为json格式
env()
list_lines()
if insert_addr+'\n' in lines:
if ' '+insert_conf+'\n' in lines:
while True:
user_input = input('需要修改为:').strip()
if len(user_input) == 0:
print('输入不能为空,请重新输入!')
continue
else:
open('conf', 'w').write(re.sub(insert_conf, user_input,open('conf.bak').read()))#读取文件conf.bak中
# insert_conf替换为user_input,这里re.sub是查找替换,正则表达式。
print('已将:%s\n'
'修改为:%s'%(insert_conf,user_input))
return True
if if_else():
continue
else:
continue
 #配置文件查看函数
def see_conf():
    while True:
user_input = input('请输入需要查找的内容:').strip()
if len(user_input) == 0:
print('输入不能为空,请重新输入')
continue
else:
with open('conf','r') as f:
for line in f:
if user_input in line.strip():
print(line)
print(next(f))
return
else:
print('无法查找')
return
 while True:
print('1、%s 2、%s 3、%s 4、%s'%('增加','删除','修改','查看'))
user_input = input('请选择对配置文件的动作:').strip()
if len(user_input) == 0:
print('输入不能为空,请重新输入!')
continue
if user_input == '' or user_input == '增加':
increase_conf()
break
if user_input == '' or user_input == '删除':
del_conf()
break
if user_input == '' or user_input == '修改':
modify_conf()
break
if user_input == '' or user_input == '查看':
see_conf()
break
else:
print('输入有误')
continue

python3配置文件的增删改查,记录一下的更多相关文章

  1. Mybatis的学习总结(一)——使用配置文件实现增删改查

    在使用Mybatis作为持久层来进行操作数据库,有很多的操作都是一样的,基本上都是先得到session,然后调用session提供的相关方法进行操作,接着提交session,最后关闭session.那 ...

  2. SSM 整合 quartz JDBC方式实现job动态增删改查记录

    虽然网上有很多资料,但是都不够系统,本文记录下自己的整合过程. 1. 搭建一个SSM项目,此处略. 2. 按照quartz官方要求,建立quartz相关的数据库和表,相关sql语句如下: /* Nav ...

  3. winform 配置文件增删改查

    winform 配置文件是  App.config webform   的配置文件 是web.config 其实基本操作都一样    设置个配置文件  全局文件 访问者个配置文件  对这个配置文件增删 ...

  4. Mybatis学习总结(二)—使用接口实现数据的增删改查

    在这一篇中,让我们使用接口来实现一个用户数据的增删改查. 完成后的项目结构如下图所示: 在这里,person代表了一个用户的实体类.在该类中,描述了相关的信息,包括id.name.age.id_num ...

  5. python 10min系列之实现增删改查系统

    woniu-cmdb 奇技淫巧--写配置文件生成增删改查系统 视频教程 项目主页跪求github给个star, 线上demo,此页面都是一个配置文件自动生成的 详细的文章介绍和实现原理分析会发布在我的 ...

  6. Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查

    一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process ...

  7. [ python ] 项目:haproxy配置文件增删改查

    1. 开发要求 实现对 haproxy.cfg 增删改查操作 2. 程序介绍 # 作者:hkey # 博客地址:https://www.cnblogs.com/hukey/p/9288279.html ...

  8. C#+Access 员工信息管理--简单的增删改查操作和.ini配置文件的读写操作。

    1.本程序的使用的语言是C#,数据库是Access2003.主要是对员工信息进行简单的增删改查操作和对.ini配置文件的读写操作. 2.代码运行效果如下: 功能比较简单.其中在得到查询结果后,在查询结 ...

  9. Mybatis框架基于映射文件和配置文件的方式,实现增删改查,可以打印日志信息

    首先在lib下导入: 与打印日志信息有关的架包 log4j-1.2.16.jar mybatis架包:mybatis-3.1.1.jar 连接数据库的架包:mysql-connector-java-5 ...

随机推荐

  1. CAShapeLayer的使用[2]

    CAShapeLayer的使用[2] CAShapeLayer支持的动画类型有如下这些. ------------------------------------------------------- ...

  2. The Shapes of CSS(css的形状)

    All of the below use only a single HTML element. Any kind of CSS goes, as long as it's supported in ...

  3. VS 2012 在 windows 8 中无法使用 Deubgger.Lunch() 对服务进行调试

    找到了外文资料:   Debugger.Launch() not displaying JIT debugger selection popup on Windows 8/8.1   If execu ...

  4. August 19th 2017 Week 33rd Saturday

    Live for today and stop stressing out about tomorrow. 为今天而活,不必为明天过分担心. Stop bewailing the past misfo ...

  5. linux gcc 区分32位或64位编译 && 请问arm存储,是以小端格式还是以大端格式?

    linux gcc 区分32位或64位编译   Linux系统下程序如何区分是64位系统还是32位系统 经过对include的翻查,最后确定gcc以__i386__来 进行32位编码,而以__x86_ ...

  6. BZOJ1048:[HAOI2007]分割矩阵(记忆化搜索DP)

    Description 将一个a*b的数字矩阵进行如下分割:将原矩阵沿某一条直线分割成两个矩阵,再将生成的两个矩阵继续如此分割(当然也可以只分割其中的一个), 这样分割了(n-1)次后,原矩阵被分割成 ...

  7. BZOJ1821:[JSOI2010]部落划分(并查集,二分)

    Description 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成 ...

  8. 【NOI2008】假面舞会

    题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会. 今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号 ...

  9. [POI2006]TET-Tetris 3D

    题目 二维线段树板子题啊 但是惊讶的发现我不会打标记 毕竟内层是线段树不能\(pushup\)也不能\(pushdown\) 于是考虑一下标记永久化 其实非常显然\(mx_i\)表示区间最大值,\(t ...

  10. LayIM.AspNetCore Middleware 开发日记(四)主角登场(LayIM介绍)

    前言 在前几篇中已经初步介绍了开发AspNetCore中间件的一些基础知识,不过都没有很深入的去研究,后续还是需要去看看源码.本篇呢,终于有点开头的味道了,就是要介绍LayIM了,其实标题写的是主角, ...