python day3
目录:
1.集合
2.文件操作
3.编码转换
4.函数
一.集合
集合是无序的
list_1 = [1,4,5,7,3,6,7,9] list_1 = set(list_1) list_2 =set([2,6,0,66,22,8,4]) print(list_1,list_2)
执行结果:
#交集 print(list_1 & list_2) #union print(list_2 | list_1) #difference print(list_1 - list_2) # in list 1 but not in list 2 #对称差集 print(list_1 ^ list_2)
执行结果:
#添加一个 list_1.add(999) #添加多个 list_1.update([888,777,555]) print(list_1)
执行结果:
#删除一个值 print(list_1.pop()) print(list_1.pop()) #删除指定值 list_1.discard(999) print(list_1)
执行结果:
二.文件操作
open文件的读写追加参数:
r :读模式
w:写模式(清空原内容,在写入)
a:末尾追加模式
打开并读取文件:
f = open('test','r+',encoding='utf-8') date = f.read() print(date) f.close()
打开文件追加内容
注意with open() 和上面打开读取文件的open() 都是 打开文件的方法,区别在于 with open()打开的文件在 with open()的子代码结束后会自动关闭文件
而open()打开的文件需要手动close()关闭
import time time_format='%Y-%m-%d %X' #时间的格式%Y年 %m月 %d日 %X时分秒 time_current=time.strftime(time_format) #赋值当前时间到变量 with open('log','a') as f: f.write('%s hehehehe\n' %(time_current))
执行结果(类似于写日志):
文件修改
f = open("test","r",encoding="utf-8") f_new = open("test_new","w",encoding="utf-8") for line in f: #逐行读取文件内容 if "楚风" in line: #比对 楚风 是否在内容中 line = line.replace("楚风","水银灯") #replace 字符串的替换 f_new.write(line) #把内容写入新的文件 f.close() #关闭文件 f_new.close() #关闭文件
执行结果:
三.编码转换
一句话:非Unicode编码要想转换成其他编码 需要先decode()成Unicode,然后在encode()成要转换的编码
四.函数和过程
def 定义过程或者函数
#过程 = 没有return的函数,在ptyhon中过程会有一个隐式的返回值 return none def func1(): "双引号内写用途描述,可写可不写,建议写" print('you are super star...') #函数 def func2(x): "双引号内写用途描述,可写可不写,建议写" print(x) return 0 def func3(y,z): print('you are %s %s...' %(y,z)) return 1,'syd',['a',1],{'福州':['仓山','鼓楼']} def func4(d,e): print('you are %s %s...' %(d,e)) return d #默认参数 ,调用的时候不传g的值 则取默认值g=2 如果调用的时候传递g的值 则以传递的值为准 def func5(f,g=2): print(f,g) return 0 a = func1() b = func2('hehed') c = func3('super',1) s = func4(e='super',d=1) print(a) print(b) print(c) print(s) func5(6) func5(6,99)
执行结果:
函数的参数组(非固定个数的参数)
#参数组 #*args:接受N个位置参数,转换成元组形式 def test(*args): print(args) test(1,2,3,4,5,5) #建议使用这种写法 test(*[1,2,4,5,5])# args=tuple([1,2,3,4,5]) def test1(x,*args): print(x) print(args) test1(1,2,3,4,5,6,7)
执行结果:
#**kwargs:接受N个关键字参数(格式:a=b),转换成字典的方式 def test2(**kwargs): print(kwargs) print(kwargs['name']) print(kwargs['age']) print(kwargs['sex']) test2(name='alex',age=8,sex='F') #建议这种写法 test2(**{'name':'alex','age':8,'sex':'f'}) def test3(name,**kwargs): print(name) print(kwargs) test3('alex',age=18,sex='m') def test4(name,age=18,**kwargs): print(name) print(age) print(kwargs) test4('alex',age=34,sex='m',hobby='tesla')
执行结果:
def test4(name,age=18,*args,**kwargs): print(name) print(age) print(args) print(kwargs) logger("TEST4") def logger(source): print("from %s" % source) test4('alex',age=34,sex='#m',hobby='tesla')
执行结果:
程序练习 修改haproxy配置文件
ha配置文件:
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.oldboy.org server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
代码:
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author:cmr import sys, os def backendlist(file): backend_list = [] server_list = [] backend_dict = {} backend_all = {} with open(file, "r+") as f: for line in f: line = line.strip() # 去除字符串两边的空格 if line.startswith('backend') == True: # startswith字符串是否以backend开头 server_list = [] # 清空server_list 以便把第二个backend下的所有server写入server_list # print(line) backend_name = line.split()[1] # split 分割字符串为列表,默认以空格为分割符 backend_list.append(backend_name) backend_all[backend_name] = [] # 字典中创建一个空值的key,不然删除server后该backend查询会报错提示没有该key elif line.startswith('server') == True: # print(line) backend_dict['servername'] = line.split()[1] backend_dict['ip'] = line.split()[2] backend_dict['weight'] = line.split()[4] backend_dict['maxconn'] = line.split()[6] server_list.append(backend_dict.copy()) backend_all[backend_name] = server_list # print(backend_dict) # print('backend_list',backend_list) # print('backend_all',backend_all) return (backend_list, backend_all) def show_backend(backendlist): # 展示backend信息 show_backend = {} (backend_list, backend_dict) = backendlist(file) print("欢迎使用haproxy配置工具".center(50, '-')) print("backend信息如下:") for index, bk_name in enumerate(backend_list): # 获取列表值对应的index print(index, bk_name) show_backend[index] = bk_name return show_backend def show_action_list(): # 展示操作清单 content = '''操作清单: 1.查看backend和server信息 2.添加backend和server信息 3.修改backend和server信息 4.删除backend和server信息 5.退出 ''' print("-".center(50, '-')) print(content) def show_server_info(choice, backend_all, backend_list): # 展示server信息 serverinfo_list = [] backend_name = backend_list[choice] for index, server_info in enumerate(backend_all[backend_name]): # 取出该backend下的所有server节点信息 info = ('server %s %s weight %s maxconn %s' \ % (server_info['servername'], server_info['ip'], server_info['weight'], server_info['maxconn'])) print(index, info) serverinfo_list.append(info) # print(serverinfo_list) return serverinfo_list def back(): flag = 0 while flag != 'b': flag = input("操作完成,按b返回:") if flag == 'b': break return flag def add(): add_server = {} print("操作清单:") print("1.添加backend") print("2.添加server") choice = input("请选择操作编号:") if choice == '1': insert_backend_name = input("请输入新的backend:") backend_list.append(insert_backend_name) print(backend_list[-1], '添加成功!') servername = input("请输入%s下新增的server名称:" % (backend_list[-1])) ip = input("请输入%s下新增的ip:" % (backend_list[-1])) weight = input("请输入%s下新增的weight:" % (backend_list[-1])) maxconn = input("请输入%s下新增的maxconn:" % (backend_list[-1])) add_server['servername'] = servername add_server['ip'] = ip add_server['weight'] = weight add_server['maxconn'] = maxconn # print(add_server) print('--insert_backend_name--', insert_backend_name) print('--add_server--', add_server) with open(file, 'r') as f, open(new_file, 'w') as f_new: for line in f: f_new.write(line) f_new.write('\nbackend %s\n' % (insert_backend_name)) f_new.write('\t\tserver %s %s weight %s maxconn %s\n' % (add_server['servername'], add_server['ip'], add_server['weight'], add_server['maxconn'])) return (insert_backend_name, add_server) elif choice == '2': flag = 0 while flag != 'b': insert_backend_server = input("请输入要添加server的backend名字:") if insert_backend_server in (backend_list): servername = input("请输入%s下新增的server名称:" % (insert_backend_server)) ip = input("请输入%s下新增的ip:" % (insert_backend_server)) weight = input("请输入%s下新增的weight:" % (insert_backend_server)) maxconn = input("请输入%s下新增的maxconn:" % (insert_backend_server)) add_server['servername'] = servername add_server['ip'] = ip add_server['weight'] = weight add_server['maxconn'] = maxconn print(add_server) with open(file, 'r') as f, open(new_file, 'w') as f_new: for line in f: if line.strip() == 'backend %s' % (insert_backend_server): f_new.write('backend %s\n' % (insert_backend_server)) f_new.write('\t\tserver %s %s weight %s maxconn %s\n' % (add_server['servername'], add_server['ip'], add_server['weight'], add_server['maxconn'])) else: f_new.write(line) flag = 'b' else: print("backend 不存在...") else: print("参数错误!") def backend_index_list(): backend_index_list = [] for index in showbackend: backend_index_list.append(index) return backend_index_list def update(): update_server = {} backend_num = input("请输入要修改的backend编号:") if backend_num.isdigit(): backend_num = int(backend_num) if backend_num in backendindexlist: print('backend:', backend_list[backend_num]) serverinfo = show_server_info(backend_num, backend_all, backend_list) long = len(serverinfo) # print(backend_all) update_choice = int(input("请选择要修改的server编号:")) if update_choice >= 0 and update_choice < long: old_dict = backend_all[backend_list[backend_num]][update_choice] old_date = 'server %s %s weight %s maxconn %s' \ % (old_dict['servername'], old_dict['ip'], old_dict['weight'], old_dict['maxconn']) print(old_date) servername = input("请输入%s下修改的server名称:" % (backend_list[backend_num])) ip = input("请输入%s下修改的ip:" % (backend_list[backend_num])) weight = input("请输入%s下修改的weight:" % (backend_list[backend_num])) maxconn = input("请输入%s下修改的maxconn:" % (backend_list[backend_num])) update_server['servername'] = servername update_server['ip'] = ip update_server['weight'] = weight update_server['maxconn'] = maxconn update_dict = update_server update_date = '\t\tserver %s %s weight %s maxconn %s\n' \ % (update_dict['servername'], update_dict['ip'], update_dict['weight'], update_dict['maxconn']) # print(update_date) backend_all[backend_list[backend_num]][update_choice] = update_dict # 修改的参数重新传入字典,更新数据 print(backend_all) with open(file, 'r') as f, open(new_file, 'w') as f_new: for line in f: # line = line.strip() if line.strip() == old_date: f_new.write(update_date) else: f_new.write(line) else: print("编号不存在。。。") else: print("backend不存在...") else: print("请输入整数...") def delete(): update_server = {} backend_num = input("请输入要删除的backend编号:") if backend_num.isdigit(): backend_num = int(backend_num) if backend_num in backendindexlist: print('backend:', backend_list[backend_num]) serverinfo = show_server_info(backend_num, backend_all, backend_list) long = len(serverinfo) # print(backend_all) # print(backend_all[backend_list[backend_num]]) update_choice = int(input("请选择要删除的server编号:")) if update_choice >= 0 and update_choice < long: old_dict = backend_all[backend_list[backend_num]][update_choice] old_date = 'server %s %s weight %s maxconn %s' \ % (old_dict['servername'], old_dict['ip'], old_dict['weight'], old_dict['maxconn']) print(old_date) # print(backend_all[backend_list[backend_num]]) # print(backend_all[backend_list[backend_num]]) with open(file, 'r') as f, open(new_file, 'w') as f_new: for line in f: if line.strip() == old_date: continue else: f_new.write(line) else: print("编号不存在。。。") else: print("backend不存在...") else: print("请输入整数...") def check_empty_backend(): for i in backend_all: if backend_all[i] == []: is_del = input("是否删除空backend节点:%s :" % (i)) if is_del == 'y': print(i) backend_all.pop(i) # print(backend_all) with open(file, 'r') as f, open(new_file, 'w') as f_new: for line in f: if line.strip() == 'backend %s' % (i): continue else: f_new.write(line) write_and_back() return 'b' return 'n' # print(backend_all) def write_and_back(): os.rename(file, 'backup') os.rename(new_file, file) os.rename('backup', new_file) # 主程序 flag = 0 file = 'test' new_file = "%s_bakup" % (file) exit_flag = '0' while exit_flag != '5': (backend_list, backend_all) = backendlist(file) showbackend = show_backend(backendlist) backendindexlist = backend_index_list() show_action_list() active_num = input("请输入需要操作的编号:") if active_num == '1': # -----------------查看 choice = int(input("请选择backend编号:")) print('%s :' % (backend_list[choice])) show_server_info(choice, backend_all, backend_list) back() elif active_num == '2': # -----------------添加 add() write_and_back() back() elif active_num == '3': update() write_and_back() back() elif active_num == '4': back_flag = check_empty_backend() if back_flag == 'b': back() continue delete() write_and_back() back() elif active_num == '5': exit_flag = '5' else: print('参数错误!') back()