1 # coding = utf-8
2
3 import os
4 import json
5 import re
6 '''
7 本程序旨在将练习基础知识部分,包括:
8 列表,元组,字典,文件,函数,字符串等知识
9 实现的功能:
10 1.查询
11 2.删除
12 3.更改
13 4.增加
14 '''
15
16 #定义的文档存储格式
17 mes_style = '''bankend www.baidu.org
18 server 192.168.50.21 wight 100 maxconn 300
19 bankend www.oldboy.org
20 server 192.168.99.31 wight 50 maxconn 100\n
21 '''
22
23 #用户只能修改这些字段的值
24 updateable ={
25 1:"server",
26 2:"wight",
27 3:"maxconn"
28 }
29
30 #菜单
31 menu_info = '''
32 1.查询
33 2.删除
34 3.修改
35 4.添加
36 5.退出
37 '''
38
39
40
41 #展示菜单
42 def show_menu():
43 '''
44 to display the menu ,I chosed the str to show it
45
46 '''
47 print(menu_info)
48
49 #初始化操作,往文件里边添加格式文件
50 def before_start():
51 '''
52 before start,you can call this func to create a file
53 and then you should explanatory(注释) this method before calling
54 the main method
55 '''
56 f = open("web.property","a+",encoding="utf-8")
57 for i in mes_style:
58 f.writelines(i)
59 f.close()
60 #before_start()
61 #查询记录
62 def search(user_enter):
63 '''
64 this function can be used when search function needed
65 user can select the listed item and then,the corresponding
66 entry will be display
67 '''
68 #查询并打印出用户查询关键字所在的行和下一行
69 f = open("web.property","r",encoding="utf-8")
70 list = f.readlines()
71 for i,line in enumerate(list):
72 if user_enter in line:
73 print(line)
74 print(list[i+1])
75 elif i == len(list)-1:
76 print("查无结果")
77 f.close()
90
91 #查出所有的文件内容,并包装成字典返回
92 def searchall():
93 '''
94 this function is a common function ,it can used in delete and update,so add
95 '''
96 f = open("web.property", "r", encoding="utf-8")
97 list = f.readlines()
98 #用来存储找到value为空所对应的key
99 list1 =[]
100 mapc = {}
101 for i,line in enumerate(list):
102 if line == "\n" or line == "":
103 list.pop(i)
104 for i in range(0,len(list),2):
105 mapc[int(i/2)+1] =list[i:i+2]
106 f.close()
107 return mapc
108 #删除
109 def delete():
110 '''
111 this function is used to delete the record user selected
112 '''
113 flag = True
114 while flag:
115 maps = searchall()
116 for i in maps.items():
117 print(i)
118 user_selected = input("请选择要删除的对象(输入b返回):")
119 if user_selected.isdigit():
120 user_selected = int(user_selected)
121 #print(list)
122 for j in maps.keys():
123 if user_selected == j:
124 temp = j
125 for m in maps.items():
126 if user_selected == m:
127 temp = m
128 #删除文件中对应的该条记录
129 for line in list(maps.keys()):
130 if temp== line:
131 maps.pop(temp)
132 file_path = "C:/Users/Administrator/PycharmProjects/pythondemo/web.propertybak"
133 if os.path.exists(file_path):
134 os.remove(file_path)
135 os.renames("web.property", "web.propertybak")
136 f6 = open("web.property", "w")
137 for line in maps.values():
138 f6.write(line[0])
139 f6.write(line[1])
140 f6.close()
141 break
142 else:
143 break
144 print(maps)
145 #询问是否继续
146 conti = input("是否继续删除?(y/n):")
147 if conti == "y":
148 continue
149 else:
150 flag = False
151 break
152 elif user_selected == "b":
153 break
154 else:
155 print("输入有错误,请重新选择")
156
157
158 #添加
159 def add():
160 '''
161 you can execute add funciton to add a node to file
162 but you should according to those forms
163 1:"server",
164 2:"wight",
165 3:"maxconn"
166 '''
167 #regs ={"bankend":"www.\w.com","server":"\d.\d.\d.\d"}
168
169
170 while True:
171 print("请依次填入下列选项中的值")
172 bankend = input("bankend:")
173 server = input("server:")
174 wight = input("wight:")
175 maxconn = input("maxconn:")
176 # 正则表达式检查输入是否符合格式要求
177 if re.compile(r"www\.(\w+)(\.com|\.cn|\.org|\.net)").match(bankend):
178 print("bankend ok")
179 if re.compile(r"\d+\.\d+\.\d+\.\d").match(server):
180 print("server ok")
181 if re.compile(r"\d").match(wight):
182 print("wight ok")
183 if re.compile(r"\d").match(maxconn):
184 print("maxconn ok")
185 #条件都符合
186 write_date =["bankend %s\n"%bankend," server %s wigth %d maxconn %d"%(server,int(wight),int(maxconn))]
187 f = open("web.property", "a", encoding="utf-8")
188 for line in write_date:
189 f.writelines(line)
190 f.close()
191 break
192 else:
193 print("maxconn invalid")
194 continue
195 else:
196 print("wight invalid")
197 continue
198 else:
199 print("server invalid")
200 continue
201 else:
202 print("bankend invalid")
203 continue
204
205
206 #更新
207 def update():
208 '''
209 this function is designed for update the file message,content
210 '''
211 state = 0
212 while True:
213 mapa = searchall()
214 for i,m in enumerate(mapa):
215 print(str(i+1)+"."+str(mapa[m]))
216 it = input("请选择要更改的条目:(b 返回)")
217 if it.isdigit():
218 it = int(it)
219 for i in mapa.keys():
220 if it == i:
221 print("check pass")
222 while True:
223 for member in updateable:
224 print(str(member)+":"+updateable[member])
225 user_se = input("请选择要修改的字段(按b返回):")
226 if user_se.isdigit():
227 user_se =int(user_se)
228 for j in updateable.keys():
229 if user_se == j:
230 print("check pass2")
231 while True:
232 update_to = input("请输入值:")
233 if update_to==None or update_to=="":
234 pass
235 else:
236 break
237 print(user_se)
238 #获得选择的字段
239 map_attr = updateable[user_se]
240 li =[]
241 for l in mapa[it]:
242 if map_attr in l:
243 li.append(l.split(" "))
244 print(l)
245 #print(li)
246 for i,ind in enumerate(li[0]):
247 if(map_attr in ind and map_attr == "server"):
248 ind = " "+map_attr+" "+(str(update_to) if update_to.isdigit() else update_to)
249 elif (map_attr in ind ):
250 ind = " " + map_attr + " " + (str(update_to) if update_to.isdigit() else update_to)
251 li[0][i]=ind
252 break
253 #同步到mapa
254 final_str =""
255 for i in li[0]:
256 if "server" in i:
257 final_str += " "+i+" "
258 elif "wight" in i:
259 final_str +=i+" "
260 else:
261 final_str += i
262 #print(final_str)
263 for i,n in enumerate(mapa[it]):
264 if "server" in n:
265 mapa[it][i] =final_str+"\n"
266 print(mapa)
267 with open("web.property","w") as f:
268 for line in mapa.values():
269 f.writelines(line)
270 f.close()
271 print(mapa)
272 print(li)
273 print("修改成功")
274 break
275 elif j == len(updateable):
276 print("不在选项内,请重新选择")
277 elif user_se == "b":
278 break
279 elif i ==len(mapa):
280 print("输入选项不在列表中,请重新选择")
281 elif it == "b":
282 state = 1
283 break
284 else:
285 print("输入有误")
286 if state == 1:
287 return
288
289 #主程序
290 while True:
291 show_menu()
292 selected = input("请选择:(1,2,3,4,5):")
293 if selected.isdigit():
294 selected = int(selected)
295 if selected == 1:
296 search(input("请输入要查询的网址:"))
297 if selected == 2:
298 delete()
299 if selected == 3:
300 update()
301 if selected == 4:
302 add()
303 if selected == 5:
304 break
305 else:
306 print("你输入了其他字符,请输入数字")
307 continue