Python_Day2_列表、字典、文件

一、列表、元组操作
 names = ['zhang', 'wang', 'li', 'gu', 'guan']  
 ○取第1个值names[0]   取第二到第三个names[1:3](取左不取右)----切片  取到最后一个names[1:]    取最后一个names[-1](两种排序方式,从左至右(0开始),从右至左(-1开始)倒数第二个取到最后一个names[-2:]  从第一个开始取到第二个names[0:2]或names[:2]
 ○插入  names.append('xu')----插入到最后一个    names.insert(1, 'qin')---插入到wang前面
 ○修改  names[2] = 'xie' ----替换新的值
 ○删除  names.remove('gu');del names[4];names.pop()---删掉最后一个;names.pop(1)---效果同del names[1]
 ○查询  names.index('li')---返回位置    print(names[names.index('li')])---返回li--先查寻再取用
  可以有重复值
 ○其他操作:统计   print(names.count('wang'));names.clear()---清空列表;names.reverse()---翻转;names.sort()---排序,默认按ASSCI码升序排序,特殊符号--数字--大写字母--小写字母;names.extend()---扩展,放在末尾,以列表形式增加names.extend(names2)---names2依然存在;删除变量  del names2;
 names3 = names.copy()---输出的names3与names完全相同。修改names时,若修改元素,则names3不变,names[2] = "项“;若修改的元素是列表(列表里面的元素可以是列表),则names3随之改变,原:names = [...,["a","B"],...],names[3][0] = "A',此时输出的names3变[...,["A", "B",...]---------称之为浅copy,只是前一个列表的引用
 copy独立模块:完全复制,copy.deepcopy(),形成完全独立的两个列表,占用两份独立空间; copy.copy()----依旧是浅copy,
  import copy
  person = ['name', '['a', 100]
  浅copy的实现方式: p1 = copy.copy(person);p2 = person[:];p3 = list(person) 列表循环:for i in names:
    print(i)-----输出列表中所有元素
 print(names[0:-1:2])或print(names[::2])----隔一个输出一个元素值
 
1 import copy
 2 names = ["Sun", "Li", "Ji", [1, 3, 5], "Fan"]
 3 
 4 print(names[::3])
 5 for i in names:
 6     print(i)
 7 name2 = copy.copy(names)    # 浅copy
 8 print(names, name2)
 9 name2[2] = ""
10 name2[3][1] = 4
11 print(names, name2)
12 names.append("Lei")     # 在列表末尾插入
13 names.insert(1, "Zhang")    # 在列表位置1处插入
14 names[2] = "Xie"    # 替换
15 names.remove("Sun")     # 删除
16 names.insert(0, "Sun")
17 del names[0]    # 删除
18 names[0] = "Sun"
19 names.pop(0)    # 删除
20 print(names)
21 print(names.index("Ji"))
22 print(names[names.index("Ji")])
23 print(names[1], names[2])
24 print(names[0:2])   # 切片
25 print(names[3])     # 切片
26 print(names[-1])    # 切片
27 print(names[-3:])   # 切片
28 names2 = ['1', '2', '3']
29 names.extend(names2)    # 扩展(合并)列表
30 print(names)
31 names.reverse()     # 翻转列表
32 print(names)
33 '''names.sort()    # 表内数据类型不同时不能排序
34 print(names)'''
35 names.clear()   # 清空列表
36 print(names)
list operate
list operate
 1 ['Sun', [1, 3, 5]]
 2 Sun
 3 Li
 4 Ji
 5 [1, 3, 5]
 6 Fan
 7 ['Sun', 'Li', 'Ji', [1, 3, 5], 'Fan'] ['Sun', 'Li', 'Ji', [1, 3, 5], 'Fan']
 8 ['Sun', 'Li', 'Ji', [1, 4, 5], 'Fan'] ['Sun', 'Li', '', [1, 4, 5], 'Fan']
 9 ['Xie', 'Ji', [1, 4, 5], 'Fan', 'Lei']
10 1
11 Ji
12 Ji [1, 4, 5]
13 ['Xie', 'Ji']
14 Fan
15 Lei
16 [[1, 4, 5], 'Fan', 'Lei']
17 ['Xie', 'Ji', [1, 4, 5], 'Fan', 'Lei', '1', '2', '3']
18 ['3', '2', '1', 'Lei', 'Fan', [1, 4, 5], 'Ji', 'Xie']
19 []
output

 

 元组:元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表
 它只有2个方法,一个是count,一个是index。
 product_list.index(item),给每个item从0开始编号
 for index,item in enumerate(product_list)----返回两个值,index是从0开始的编号
 enumerate()---取出列表的下标
 len(product_list)----判断列表的长度,返回一个数值
 \033[31;1m%s\033[0m----把%s代表的字体变成红色,32--绿色
 列表可以嵌套任何数据类型
二、字符串操作str
 a = 'alex'
 a[1]
 >>>'e'----可以像列表那样取值,但不可以赋值
 对字符串的修改不是基于原来的,而是产生新的。
1 name = "My name \tis {name}, and I'm {age} years-old."
 2 
 3 print(name.capitalize())    # 首字母大写,其余小写
 4 print(name.count("s"))      # 字符串中某字符出现的次数,可指定开始结束位置
 5 print(name.casefold())      # 将所有大写字母转换为小写,类似lower()方法
 6 print(name.center(50, "-"))     # 打印50个字符,不够的用-补齐,且将name放于中间
 7 print(name.endswith("C"))   # 判断字符串是否以指定后缀结尾,是True否False,可指定开始结束位置
 8 print(name.startswith("M"))     # 判断字符串是否以指定前缀开始,是True否False,可指定开始结束位置
 9 print(name.expandtabs(tabsize=0))    # 将字符串中的\t转换为指定数量的空格
10 print(name.find("name"))    # 索引字符(串)的开始位置-可用于字符串切片
11 print(name.format(name='SJC', age=18))      # 格式化
12 print(name.format_map({'name': 'SJC', 'age': 18}))  # 可传字典格式
13 print(name.isalnum())       # 检测字符串是否由字母和数字组成
14 print(name.isalpha())       # 检测字符串是否只由字母组成
15 print(name.isdecimal())     # 检查字符串是否只包含十进制字符
16 print(name.isdigit())       # 检测字符串是否只由数字组成
17 print('Name'.isidentifier())  # 判断是否是一个合法的标识符(变量名)
18 print(name.islower())       # 检测字符串是否由小写字母组成
19 print(name.isnumeric())     # 检测字符串是否只由数字组成。这种方法是只针对unicode对象。
20 print(name.istitle())       # 检测字符串是否是标题格式
21 print(name.isupper())       # 检测字符串是否由大写字母组成
22 print(','.join(['1', '2', '3']))      # 将序列(字符串、列表等)中的元素以指定的字符连接生成一个新的字符串 str.join(sequence)
23 print(name.ljust(50, "*"))  # 打印50个字符,不够的用*补齐,将name放于前方
24 print(name.rjust(50, "@"))  # 打印50个字符,不够的用*补齐,将name放于后方
25 print(name.lower())         # 大写换小写
26 print(name.upper())         # 小写换大写
27 print("\nSJC\n".lstrip())   # 从左侧去除空格或回车
28 print("\nSJC\n".rstrip())   # 从右侧去除空格或回测
29 print("\nSJC\n".strip())    # 去除两侧空格或回车
30 p = str.maketrans("SJC", "123")
31 # 创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标
32 # 两个字符串的长度必须相同,为一一对应的关系
33 print("SJC".translate(p))   # 用p的映射关系转换字符SJC后输出
34 print("baidu.com".partition("."))  # 据指定的分隔符将字符串进行分割
35 # 如果字符串包含指定的分隔符,则返回一个3元的元组,第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串
36 print('python is funny'.replace('n', '*', 1))   # 替换且可指定最大替换次数
37 print(name.rfind('a'))     # 从左向右查找,找到最右侧的a并返回其位置
38 print(name.rsplit())
39 print("1+2+3+4".split("+"))     # 将字符串按照要求分割为列表(默认为空字符,可指定其他字符),可指定分割次数
40 print(name.swapcase())      # 大小写互化
41 print(name.title())         # 化成标题格式
42 print(name.zfill(50))       # 从左侧用0填充字符串至指定长度

String Operate
String operate
1 My name     is {name}, and i'm {age} years-old.
 2 2
 3 my name     is {name}, and i'm {age} years-old.
 4 ---My name     is {name}, and I'm {age} years-old.---
 5 False
 6 True
 7 My name is {name}, and I'm {age} years-old.
 8 3
 9 My name     is SJC, and I'm 18 years-old.
10 My name     is SJC, and I'm 18 years-old.
11 False
12 False
13 False
14 False
15 True
16 False
17 False
18 False
19 False
20 1,2,3
21 My name     is {name}, and I'm {age} years-old.******
22 @@@@@@My name     is {name}, and I'm {age} years-old.
23 my name     is {name}, and i'm {age} years-old.
24 MY NAME     IS {NAME}, AND I'M {AGE} YEARS-OLD.
25 SJC
26 
27 
28 SJC
29 SJC
30 123
31 ('baidu', '.', 'com')
32 pytho* is funny
33 36
34 ['My', 'name', 'is', '{name},', 'and', "I'm", '{age}', 'years-old.']
35 ['1', '2', '3', '4']
36 mY NAME     IS {NAME}, AND i'M {AGE} YEARS-OLD.
37 My Name     Is {Name}, And I'M {Age} Years-Old.
38 000000My name     is {name}, and I'm {age} years-old.
39 
40 Process finished with exit code 0

Output
Output

 

三、字典操作
 1.字典操作
  字典是一种key-value的数据类型。
   语法:info = {'stu1101':"TengLan Wu",
   'stu1102':"LongZe Luola",
   'stu1103':"XiaoZe Maliya",
   }
  字典的特性:1)dict是无序的;2)key必须是唯一的,所以会自动去掉重复的。
  增删改查
  多级字典嵌套及操作
  key尽量用英文,不要用中文
  catalog.setdefault(key:value)现在字典中查找,若有,则返回取到的值;若没有,则添加,再返回。
  info.update(b)---将字典b和字典info合并到info,若存在交叉(key相同),则覆盖原有的。
  info.items()---把字典转成列表
  dict.fromkeys()----初始化一个新的字典,给初始值
   c = dict.fromkeys([6,7,8],[1,{'name':'alex'},432])
   print(c)
   c[7][1]['name'] = 'Jack Chen'#此时会修改所有的键值
   print(c)
   输出结果:{6: [1, {'name': 'alex'}, 432], 7: [1, {'name': 'alex'}, 432], 8: [1, {'name': 'alex'}, 432]}
   {6: [1, {'name': 'Jack Chen'}, 432], 7: [1, {'name': 'Jack Chen'}, 432], 8: [1, {'name': 'Jack Chen'}, 432]}
  循环字典
   for i in info:
   print(i,info[i])   for k,v in info.items():   print(k,v)
   ---二者输出结果相同,但第一种更高效,数据量大时
  pass---占位符,什么也不做
  
 1 # Author: April
 2 age_of_oldboy = 56
 3 
 4 for i in range(3):#i从0开始执行,默认步长为1
 5     guess_age = int(input("guess age:"))
 6     if guess_age == age_of_oldboy:
 7         print("yes, you get it. ")
 8         break
 9     elif guess_age > age_of_oldboy:
10         print("think smaller...")
11     else:
12         print("think bigger!")
13 else:
14     print('you have tried too many times...')
for
 1 #key-value数据类型
 2 
 3 '''c = dict.fromkeys([6,7,8],[1,{'name':'alex'},432])
 4 print(c)
 5 c[7][1]['name'] = 'Jack Chen'
 6 print(c)
 7 
 8 catalog = {
 9     '欧美':{'w':['多','大','一般'],
10           'y':['多','大','高'],
11           'z':['高','真']
12           },
13     '日韩':{'a':['多','大'],
14           'b':['多','大','高'],
15           'c':['高','真','一般']
16           },
17 }
18 catalog['日韩']['a'][1] = '或'
19 catalog.setdefault('日韩',{'r':[1,2,3]})
20 print(catalog)
21 '''
22 
23 info = {
24     'stu1101': "Teng",
25     'stu1102': "Long",
26     'stu1103': "Xiao",
27 }
28 for i in info:
29     print(i,info[i])
30 
31 for k,v in info.items():
32     print(k,v)
33 
34 
35 '''#info['stu1104']
36 print(info.get('stu1104'))#安全获取键值
37 print('stu1103' in info)
38 
39 
40 print(info)
41 #print(info['stu1101'])
42 #info['stu1101'] = '藤'
43 info['stu1104'] = '藤'
44 #del
45 #del info['stu1101']
46 #info.pop('stu1102')
47 info.popitem()
48 print(info)
49 '''
dictionary

 

四、集合操作
 集合是一个无序的,不重复的数据组合,作用:
  去重---把一个列表变成集合,就自动去重了
  关系测试---测试两组数据之间的交集、差集、并集等关系。
 1 list_1 = [1,4,5,7,3,6,7,9]
 2 list_1 = set(list_1)#转换为集合
 3 print(list_1, type(list_1))
 4 
 5 list_2 = set([2,6,0,66,22,8])
 6 print(list_1,list_2)
 7 
 8 #交集
 9 print(list_1.intersection(list_2))
10 
11 #并集
12 print(list_1.union(list_2))
13 
14 #差集
15 print(list_1.difference(list_2)) 
set

 

1 info = {
2     'stu1101': "SJC",
3     'stu1102': "WRR",
4     'stu1103': "WK"
5 }
dict
1 info = {
 2     'stu1101': "SJC",
 3     'stu1102': "WRR",
 4     'stu1103': "WK"
 5 }
 6 print(info)
 7 print(info['stu1101'])      # 如果key不存在会报错
 8 info['stu1101'] = "ZYH"     # key存在则改其value不存在则新增
 9 print(info)
10 print("stu1104" in info)    # key存在返回True否则返回False
11 print(info.get('stu1104'))      # 如果key不存在会返回None
12 print(info.values())        # 输出所有value
13 print(info.keys())          # 输出所有key
14 print(info.items())         # 字典转列表输出
15 
16 info2 = {
17     'stu1105': "LY",
18     'stu1106': "SJC"
19 }
20 info.update(info2)          # 字典合并有交叉则覆盖
21 print(info)
22 info.setdefault("stu1104", "ZJL")   # key存在则返回其现有值不存在则创建新值及其value
23 print(info)

Operate_ex
dict_operate
1 {'stu1101': 'SJC', 'stu1102': 'WRR', 'stu1103': 'WK'}
 2 SJC
 3 {'stu1101': 'ZYH', 'stu1102': 'WRR', 'stu1103': 'WK'}
 4 False
 5 None
 6 dict_values(['ZYH', 'WRR', 'WK'])
 7 dict_keys(['stu1101', 'stu1102', 'stu1103'])
 8 dict_items([('stu1101', 'ZYH'), ('stu1102', 'WRR'), ('stu1103', 'WK')])
 9 {'stu1101': 'ZYH', 'stu1102': 'WRR', 'stu1103': 'WK', 'stu1105': 'LY', 'stu1106': 'SJC'}
10 {'stu1101': 'ZYH', 'stu1102': 'WRR', 'stu1103': 'WK', 'stu1105': 'LY', 'stu1106': 'SJC', 'stu1104': 'ZJL'}

Output
Output
1 world_map = {
 2     "China": {
 3         "Hebei": ["Northeast", "flat area"],
 4         "Yunnan": ["Southwest", "hilly land"]
 5     },
 6     "Japan": {
 7         "Tokyo": ["Capital", "qqq"],
 8         "Osaka": ["South", "ppp"]
 9     },
10     "America": {
11         "New York": ["Famous of interest", "Statue of Liberty"],
12         "Washington": ["Capital", "White House"]
13     }
14 }
15 world_map["China"]["Hebei"][1] = "Nice"
16 print(world_map)

Multi_level_dic
Multi_dict
1 for i in info:      # 循环字典,高效,推荐
2     print(i)    # 只打印key
3     print(i, info[i])   # 打印key及其value
4 
5 for k, v in info.items():   # 先将字典转为列表,数据量大时耗时长,不推荐
6     print(k, v)     # 打印key及其value

dic_circulation
dic_cir

购物车程序改进

 1 product_list = [
 2     ('Iphone', 5800),
 3     ('Mac Pro', 9800),
 4     ('Bike', 800),
 5     ('Watch', 10600),
 6     ('Coffee', 31),
 7     ('Alex Python', 120),
 8 ]
 9 shopping_list = []
10 salary = input('Input your salary:')
11 if salary.isdigit():#判断是否是字符串。若是,则返回真(1)
12     salary = int(salary)
13     while True:
14         for index,item in enumerate(product_list):#此时返回两个值
15 #            print(product_list.index(item),item)
16             print(index,item)
17         user_choice = input('选择需要购买的商品>>>:')
18         if user_choice.isdigit():
19             user_choice = int(user_choice)
20             if user_choice < len(product_list) and user_choice >= 0:
21                 p_item = product_list[user_choice]
22                 if p_item[1] <= salary:#买得起
23                     shopping_list.append(p_item)
24                     salary -= p_item[1]
25                     print('Added %s into shopping cart, your current balance is \033[31;1m%s\033[0m'%(p_item,salary))
26                 else:
27                     print("\033[41;1m你的余额只剩[%s]了,不能继续购买。\033[0m")
28             else:
29                 print('product code [%s] is not exist!'% user_choice)
30 
31         elif user_choice == 'q':
32             print('------shopping list------')
33             for p in shopping_list:
34                 print(p)
35             print('Your current balance:', salary)
36             exit()
37         else:
38             print('invalid option')
shopping

 

五、文件操作
 对文件操作流程
  1.打开文件,得到文件句柄并赋值给一个变量;
  2.通过句柄对文件进行操作;
  3.关闭文件。
 windows默认为GBK,打开文件时,加上encoding='utf-8'----转换编码
 f = open('yesterday', encoding = 'utf-8')#文件句柄,以后可以直接操作f.read()
 文件读完一遍后,光标从第一行走到末尾,紧接着再读时,无可读内容
  r--只读;w--只写;a---追加(在末尾);r+---读写(在原文件末尾写);w+---写读(创建新文件,再写);a+---追加读;rb,wb,ab---二进制文件(网络传输只能用二进制)
   f = open('yesterday2.txt', 'rb')
   f.write('hello binary\n'.encode())---.encode()转成二进制编码
 with open('log','r') as f:
  ......       ------自动关闭文件,不需要f.close()
 with open('log1') as obj1, open('log2') as obj2:
 . ......        ------支持同时对多个文件的上下文进行管理  
python代码中一行至多写84 个字符 多出的话另起一行
 1 '''#data = open('yesterday.txt', encoding='utf-8').read()
 2 f = open('yesterday2.txt', 'a', encoding='utf-8') # 文件句柄
 3 #a = append---追加
 4 #data = f.read()
 5 #print(data)
 6 f.write('\nwhen i was young i listen to the radio\n')
 7 #f.write('天安门上太阳升')
 8 data = f.read()
 9 print('--read',data)
10 
11 f.close()
12 '''
13 
14 #f = open('yesterday.txt', 'r', encoding='utf-8') # 文件句柄
15 
16 #单行读
17 #print(f.readline())
18 #print(f.readline())
19 #print(f.readline())
20 
21 #循环读多行
22 #for i in range(5):
23 #    print(f.readline())
24 
25 #print(f.readlines())#----得到列表
26 #low loop
27 '''
28 for index,line in enumerate(f.readlines()):
29     if index == 9:
30         print('---------')
31         continue
32     print(line.strip())
33 
34 # high loop
35 count = 0
36 for line in f:
37     if count == 9:
38         print('-------------')
39         count += 1
40         continue
41     print(line)#----逐行打印
42     count += 1
43 '''
44 '''
45 f = open('yesterday.txt', 'r', encoding='utf-8') # 文件句柄
46 print(f.tell())#打印句柄指针所在的位置,按字符个数
47 print(f.readline())
48 print(f.readline())
49 print(f.readline())
50 print(f.tell())#打印句柄指针所在的位置,按字符个数
51 f.seek(10)#回到指定位置
52 print(f.tell())
53 
54 print(f.encoding)#打印文件编码
55 
56 print(f.fileno())#调用的操作系统的借口
57 
58 #print(f.flush())#强制刷新到硬盘上,不必等缓冲区满
59 print(dir(f.buffer))
60 
61 f = open('yesterday.txt', 'w', encoding='utf-8')
62 f.write('hello 1\n')
63 f.write('hello 2\n')
64 f.write('hello 3\n')
65 
66 f = open('yesterday.txt', 'a', encoding='utf-8')
67 f.seek(10)
68 f.truncate(20)
69 '''
70 '''
71 #f = open('yesterday2.txt', 'r+', encoding='utf-8')
72 #f = open('yesterday2.txt', 'w+', encoding='utf-8')
73 f.write('-------------------------1\n')
74 f.write('-------------------------2\n')
75 f.write('-------------------------3\n')
76 f.write('-------------------------4\n')
77 print(f.tell())
78 f.seek(10)
79 print(f.tell())
80 print(f.readline())
81 f.write('should be at the beginning of the second line')#只能追加在后面,不能从指针指定的位置开始写
82 f.close()
83 '''
84 
85 f = open('yesterday2.txt','wb')#文件句柄  二进制文件
86 f.write('hello binary\n'.encode())
87 f.close()
file_open
 1 import sys
 2 f = open('yesterday2.txt','r',encoding='utf-8')
 3 f_new = open('yesterday2.bak','w',encoding='utf-8')
 4 
 5 '''
 6 for line in f:
 7     if '肆意的快乐等我享受' in line:
 8         line = line.replace('肆意的快乐等我享受','肆意的快乐等Alex享受')
 9     ''''''
10       f_new.write(line)
11     else:
12         f_new.write(line)''''''
13     f_new.write(line)
14 f.close()
15 f_new.close()
16 '''
17 
18 find_str = sys.argv[1]
19 replace_str = sys.argv[2]
20 
21 for line in f:
22     if find_str in line:
23         line = line.replace(find_str,replace_str)
24     f_new.write(line)
25 f.close()
26 f_new.close()
file_mode

 

六、字符编码与转码
 详细文章:
 http://www.cnblogs.com/yuanchenqi/articles/5956943.html
 http://www.diveintopython3.net/strings.html
 Ascii不能存中文
 编码:encode;解码: decode
 python默认是unicode编码
 #-*- coding:gbk -*-            把程序声明成按GBK模式编码
 需知:
  1.在python2默认编码是ASCII, python3里默认是unicode
  2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间
  3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string
 注:所有字符间的解码、编码都要经过unicode
1 import sys
2 
3 s = '你好'
4 s_gbk = s.encode('gbk')
5 print(s_gbk)#GBK编码
6 print(s.encode())#UTF-8编码,默认是UTF-8编码
7 gbk_to_utf8 = s_gbk.decode('gbk').encode('utf-8')#先将gbk解码为uicode,再将unicode编码为utf-8
8 print('utf8',gbk_to_utf8)
encode
 1 #-*- encoding:gbk -*-
 2 #声明文件编码
 3 import sys
 4 print(sys.getdefaultencoding())
 5 
 6 s = '你好'#s的编码仍为unicode
 7 
 8 print(s)
 9 print(s.encode('gbk'))#显示gbk编码格式
10 print(s.encode('utf-8'))
11 print(s.encode('utf-8').decode('utf-8').encode('gb2312').decode('gb2312'))#gb2312同gbk格式相同,因为gbk向下兼容
encode2

 练习

 

1 #实现简单的shell sed替换功能
2 find_str = '我有太多歌曲永远不会被唱起'
3 replace_str = 'YOUTAIDUODEGEQUYONGYUANBUHUIBEICHANGQI'
4 with open('yesterday_new.txt','r',encoding = 'utf-8') as f,\
5     open('yesterday_new.bak','w',encoding = 'utf-8') as f_new:
6     for line in f:#f为一个迭代器,按行迭代
7         if find_str in line:
8             line = line.replace(find_str,replace_str)#字符串替换replace函数
9         f_new.write(line)
excrcise_1

 

  1 # 修改haproxy配置文件
  2 # 查询:输入网址获取当前backend下的所有记录
  3 # 增加:输入字典增加一条记录
  4 # 删除:输入字典删除该记录
  5 
  6 import sys
  7 def info():
  8     '提取当前配置文件中所有backend网址信息'
  9     backend = []
 10     with open('haproxy.txt','r') as f:
 11         for line in f:
 12             if line.startswith('backend'):#判断字符串是不是以backend开头,endswith,结尾
 13                 line = line.strip()
 14                 backend.append(line.partition(' ')[2])#partition()具体是来根据括号内的分隔符将一个字符串分割,而且仅仅是切一刀,生成的结果是一个元组。
 15     return backend
 16 
 17 def search(website):
 18     '输入网址查找具体信息'
 19     info_backend = []
 20     if website in info():
 21         with open('haproxy.txt','r') as f:
 22             for line in f:
 23                 if line.strip() == 'backend' + ' ' + website:
 24                     f1 = f.readline()
 25                     while f1.startswith('    server'):
 26                         info_backend.append(f1.strip())
 27                         f1 = f.readline()
 28             print(f'\033[31m{website}条目信息:\033[0m')
 29             for i,items in enumerate(info_backend):
 30                 print(i+1,items.strip())
 31     else:
 32         print(f'{website}条目不存在')
 33     return info_backend
 34 
 35 def delete(del_dic):
 36     '删除条目'
 37     del_dic = eval(del_dic)
 38     website = del_dic['backend']
 39     if website in info:
 40         with open('haproxy.txt','r') as f:
 41             with open('haproxy_new.txt','w=') as f1:
 42                 for line in f:
 43                     if line.strip() == 'backend'+'  '+del_dic['backend']:
 44                         line = f.readline()
 45                         while line.startswith('    server'):
 46                             line = f.readline()
 47                             continue
 48                     else:
 49                         f1.write(line)
 50         print(f'{website}条目删除成功')
 51         with open('haproxy.txt','w') as f:
 52             with open('haproxy_new.txt','r') as f1:
 53                 for line in f1:
 54                     f.write(line)
 55     else:
 56         print(f'{website}条目不存在')
 57     return
 58 
 59 print("\033[31m欢迎进入haproxy配置系统\033[0m".center(50, ' '))
 60 while True:
 61     print('-'.center(50, '-'))
 62     print("当前backend网址信息如下:")
 63     for j, backend in enumerate(info()):
 64         print(j+1, backend)
 65     print('-'.center(50, '-'))
 66     print("1.信息查询", '\n', "2.增加条目", '\n', "3.删除条目", sep='')
 67     choice1 = input("输入序号进入配置界面(输入q退出系统):")
 68     if choice1.isdigit():
 69         choice1 = int(choice1)
 70         if choice1 in range(1, 4):
 71             if choice1 == 1:
 72                 while True:
 73                     choice2 = input("请输入网址进行查询(例:www.baidu.com)(b返回q退出):")
 74                     if choice2 == 'b':
 75                         break
 76                     elif choice2 == 'q':
 77                         print("系统退出")
 78                         sys.exit()
 79                     else:
 80                         search(choice2)
 81             elif choice1 == 2:
 82                 while True:
 83                     choice3 = input("请输入条目字典(b返回q退出):")
 84                     if choice3 == 'b':
 85                         break
 86                     elif choice3 == 'q':
 87                         print("系统退出")
 88                         sys.exit()
 89                     else:
 90                         add(choice3)
 91             elif choice1 == 3:
 92                 while True:
 93                     choice4 = input("请输入添加条目字典(b返回q退出):")
 94                     if choice4 == 'b':
 95                         break
 96                     elif choice4 == 'q':
 97                         print("系统退出")
 98                         sys.exit()
 99                     else:
100                         delete(choice4)
101         else:
102             print("无此选项,请正确输入!")
103     elif choice1 == 'q':
104         print("系统退出")
105         sys.exit()
106     else:
107         print("格式错误,请重新输入!")
108         continue
exercise_2

 

 

posted @ 2020-10-15 11:35  April_A  阅读(34)  评论(0)    收藏  举报