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()

 

posted @ 2017-10-15 23:37  水银灯  阅读(141)  评论(0编辑  收藏  举报