Python编写ATM(初级进阶)
Python3.7
基于面向对象编程
主要功能
一. 用户功能
查询余额, 取款, 存款, 转账, 修改个人密码
二. 管理员功能
添加新账号, 冻结账号, 解除冻结, 查询用户信息, 查询所有用户信息
三. 系统平台
登录, 冻结
四.其他
文本存储, 信息格式位: 账号,密码,级别,金额,状态,如: X0001,1234,1,10000,0
代码如下:
1 import os 2 3 4 # 普通用户 5 class Client: 6 def __init__(self, data): 7 print(data) 8 self.id = data[0] # id 9 self.password = data[1] # 密码 10 self.level = data[2] # 级别 11 self.money = data[3] # 金额 12 self.stauts = data[4] # 状态 13 14 # 查询 金额 15 def chaxun(self): 16 print("账号'%s',余额为%.2f$" % (self.id, int(self.money))) 17 return self.money 18 19 # 取钱 20 def qu(self): 21 num = int(input("输入取走金额(以百为单位,最高5000):")) 22 while num % 100 != 0 or num > int(self.money) or num < 100 or num > 5000: 23 num = int(input("输入错误,请重试:")) 24 data_list = [] 25 with open("user_info.txt", 'r', encoding='utf8') as f: 26 for line in f: 27 data_list.append(line) 28 with open("user_info(副本).txt", 'w', encoding='utf8') as f1: 29 for i in range(len(data_list)): 30 detail_list = data_list[i].strip().split(',') 31 if detail_list[0] == self.id: 32 # 取完后的钱 33 self.money = str(int(detail_list[3]) - num) 34 detail_list[3] = self.money 35 info_str = ','.join(detail_list) + "\n" 36 f1.write(info_str) 37 else: 38 info_str = ','.join(detail_list) + '\n' 39 f1.write(info_str) 40 os.remove('user_info.txt') 41 os.rename('user_info(副本).txt', 'user_info.txt') 42 print("账号'%s',取走%.2f$,余额为%.2f$" % (self.id, int(num), int(self.money))) 43 return self.money 44 # 存钱 45 def cun(self): 46 num = int(input("输入存入金额(以百为单位):")) 47 while num % 100 != 0 or num < 100: 48 num = int(input("输入错误,请重试:")) 49 data_list = [] 50 with open("user_info.txt", 'r', encoding='utf8') as f: 51 for line in f: 52 data_list.append(line) 53 with open("user_info(副本).txt", 'w', encoding='utf8') as f1: 54 for i in range(len(data_list)): 55 detail_list = data_list[i].strip().split(',') 56 if detail_list[0] == self.id: 57 # 存完之后的钱 58 self.money = str(int(detail_list[3]) + num) 59 detail_list[3] = self.money 60 info_str = ','.join(detail_list) + "\n" 61 f1.write(info_str) 62 else: 63 info_str = ','.join(detail_list) + '\n' 64 f1.write(info_str) 65 os.remove('user_info.txt') 66 os.rename('user_info(副本).txt', 'user_info.txt') 67 print("账号'%s',取走%.2f$,余额为%.2f$" % (self.id, int(num), int(self.money))) 68 return self.money 69 70 # 转账 71 def zhuan(self): 72 id_list = [] 73 with open("user_info.txt", 'r', encoding='utf8') as f: 74 for line in f: 75 info_list = line.strip().split(',') 76 id_list.append(info_list[0]) 77 print("#ID列表", id_list, ) 78 id = input("输入转账ID:") 79 while id not in id_list or id == self.id: 80 id = input("ID输入错误,请重试:") 81 if id.lower() == 'q': 82 return 83 84 num = int(input("输入转账金额(以百为单位,最高5000):")) 85 while num % 100 != 0 or num > int(self.money) or num < 100 or num > 5000: 86 num = int(input("金额输入错误,请重试:")) 87 88 data_list = [] 89 with open("user_info.txt", 'r', encoding='utf8') as f: 90 for line in f: 91 data_list.append(line) 92 93 with open("user_info(副本).txt", 'w', encoding='utf8') as f1: 94 for i in range(len(data_list)): 95 detail_list = data_list[i].strip().split(',') 96 if detail_list[0] == self.id: # 修改自己的 金额 97 self.money = str(int(detail_list[3]) - num) 98 detail_list[3] = self.money 99 info_str = ','.join(detail_list) + "\n" 100 f1.write(info_str) 101 elif detail_list[0] == id: # 增加 接收人的金额 102 detail_list[3] = str(int(detail_list[3]) + num) 103 info_str = ','.join(detail_list) + "\n" 104 f1.write(info_str) 105 else: 106 info_str = ','.join(detail_list) + '\n' 107 f1.write(info_str) 108 os.remove('user_info.txt') 109 os.rename('user_info(副本).txt', 'user_info.txt') 110 print("转账成功,剩余余额%.2f" % int(self.money)) 111 return self.money 112 113 # 修改密码 114 def xiugai(self, ): 115 old_pwd = input("输入旧密码:") 116 while old_pwd != self.password: 117 old_pwd = input("密码错误,请重试:") 118 119 new_pwd = input("输入新密码(q返回):") 120 if new_pwd.lower() == 'q': 121 print("取消修改密码") 122 return 123 124 while len(new_pwd) < 6 or len(set(new_pwd)) == 1: 125 new_pwd = input("新密码不能小于6位或者6位完全相同,请重试:") 126 127 new_pwd_2 = input("确认新密码:") 128 while len(new_pwd_2) < 6 or len(set(new_pwd_2)) == 1: 129 print("新密码不能小于6位或者6位完全相同,请重试:") 130 if new_pwd == new_pwd_2: 131 data_list = [] 132 with open("user_info.txt", 'r', encoding='utf8') as f: 133 for line in f: 134 data_list.append(line) 135 136 with open("user_info(副本).txt", 'w', encoding='utf8') as f1: 137 for i in range(len(data_list)): 138 detail_list = data_list[i].strip().split(',') 139 if detail_list[0] == self.id: # 修改自己密码 140 self.password = new_pwd 141 detail_list[1] = self.password 142 info_str = ','.join(detail_list) + "\n" 143 f1.write(info_str) 144 else: 145 info_str = ','.join(detail_list) + '\n' 146 f1.write(info_str) 147 os.remove('user_info.txt') 148 os.rename('user_info(副本).txt', 'user_info.txt') 149 print("密码修改成功,新密码为%s" % self.password) 150 return self.password 151 152 else: 153 print("2次密码不一样,请重试") 154 return 155 156 # 管理员 157 class Admin: 158 def __init__(self): 159 self.id = 'a0001' 160 self.password = '112233' 161 162 # 添加 用户 163 def tianjia(self): 164 id_list = [] 165 with open("user_info.txt", 'r', encoding='utf8') as f: 166 for line in f: 167 info_list = line.strip().split(',') 168 id_list.append(info_list[0]) 169 170 new_id = input("输入新账号ID:") 171 while new_id in id_list: 172 new_id = input("ID已存在,请重试:") 173 174 with open("user_info.txt", 'a', encoding='utf8') as f: 175 f.write(new_id + ',' + '123456' + ',' + '1' + ',' + '10000' + ',' + '0' + '\n') 176 print(new_id, '添加成功') 177 178 # 冻结 179 def dongjie(self): 180 id_list = [] 181 with open("user_info.txt", 'r', encoding='utf8') as f: 182 for line in f: 183 info_list = line.strip().split(',') 184 id_list.append(info_list[0]) 185 186 dongjie_id = input("输入冻结账号ID:") 187 while dongjie_id not in id_list: 188 dongjie_id = input("ID不存在,请重试:") 189 190 data_list = [] 191 with open("user_info.txt", 'r', encoding='utf8') as f: 192 for line in f: 193 data_list.append(line) 194 195 with open("user_info(副本).txt", 'w', encoding='utf8') as f1: 196 for i in range(len(data_list)): 197 detail_list = data_list[i].strip().split(',') 198 if detail_list[0] == dongjie_id: # 修改自己密码 199 detail_list[-1] = '1' 200 info_str = ','.join(detail_list) + "\n" 201 f1.write(info_str) 202 else: 203 info_str = ','.join(detail_list) + '\n' 204 f1.write(info_str) 205 os.remove('user_info.txt') 206 os.rename('user_info(副本).txt', 'user_info.txt') 207 print(dongjie_id, '以冻结') 208 209 # 解冻 210 def jiedong(self): 211 id_list = [] 212 with open("user_info.txt", 'r', encoding='utf8') as f: 213 for line in f: 214 info_list = line.strip().split(',') 215 id_list.append(info_list[0]) 216 217 jiedong_id = input("输入解冻账号ID:") 218 while jiedong_id not in id_list: 219 jiedong_id = input("ID不存在,请重试:") 220 221 data_list = [] 222 with open("user_info.txt", 'r', encoding='utf8') as f: 223 for line in f: 224 data_list.append(line) 225 226 with open("user_info(副本).txt", 'w', encoding='utf8') as f1: 227 for i in range(len(data_list)): 228 detail_list = data_list[i].strip().split(',') 229 if detail_list[0] == jiedong_id: # 修改自己密码 230 detail_list[-1] = '0' 231 info_str = ','.join(detail_list) + "\n" 232 f1.write(info_str) 233 else: 234 info_str = ','.join(detail_list) + '\n' 235 f1.write(info_str) 236 os.remove('user_info.txt') 237 os.rename('user_info(副本).txt', 'user_info.txt') 238 print(jiedong_id, '已解冻') 239 240 # 查询用户信息 241 def chaxun(self): 242 id_list = [] 243 with open("user_info.txt", 'r', encoding='utf8') as f: 244 for line in f: 245 info_list = line.strip().split(',') 246 id_list.append(info_list[0]) 247 print('ID列表', id_list) 248 chaxun_id = input("查询ID:") 249 250 while chaxun_id not in id_list: 251 print('ID列表', id_list) 252 chaxun_id = input("ID不存在,请重试:") 253 254 l = ['账号', '密码', '级别(0管理员,1普通)', '金额', '状态(0正常,1冻结)'] 255 256 with open("user_info.txt", 'r', encoding='utf8') as f: 257 for line in f: 258 info_list = line.strip().split(',') 259 if chaxun_id == info_list[0]: 260 for i in range(len(info_list)): 261 print(l[i], ">>>", info_list[i]) 262 return 263 else: 264 print("ID不存在,请重试:") 265 266 267 # ATM 系统 268 class ATM: 269 270 def __init__(self): 271 with open("user_info.txt", 'w', encoding='utf8') as f: 272 f.write("a0001,112233,0,10000,0" + '\n') # 管理员 273 f.write("p0001,123456,0,10000,0" + '\n') # 普通账号1 274 f.write("p0002,123456,0,10000,0" + '\n') # 普通账号2 275 276 # 密码错三次冻结 277 def dongjie(self, ID): 278 data_list = [] 279 with open("user_info.txt", 'r', encoding='utf8') as f: 280 for line in f: 281 data_list.append(line) 282 283 with open("user_info(副本).txt", 'w', encoding='utf8') as f1: 284 for i in range(len(data_list)): 285 detail_list = data_list[i].strip().split(',') 286 if detail_list[0] == ID: # 修改自己密码 287 detail_list[-1] = '1' 288 info_str = ','.join(detail_list) + "\n" 289 f1.write(info_str) 290 else: 291 info_str = ','.join(detail_list) + '\n' 292 f1.write(info_str) 293 os.remove('user_info.txt') 294 os.rename('user_info(副本).txt', 'user_info.txt') 295 296 # z主程序运行 297 def run(self): 298 ID = input("请输入卡号:") 299 password = input("请输入密码:") 300 client = None 301 admin = None 302 303 # 管理员登录 304 if ID == 'a0001': 305 while password != '112233': 306 password = input("密码错误,联系管理员(q退出系统):") 307 if password.lower() == 'q': 308 print('退出系统...') 309 return 310 print("管理员登录成功") 311 admin = Admin() 312 313 if admin != None: 314 task = {'1': admin.tianjia, '2': admin.dongjie, '3': admin.jiedong, '4': admin.chaxun} 315 menu = {'1': "添加账号", '2': "冻结账号", '3': "解冻", '4': "查询信息", '5': '退出系统'} 316 317 while 1: 318 for k, v in menu.items(): 319 print(k, v) 320 321 choice = input("请输入你要执行的任务序号:") 322 if choice == '5': 323 print('退出系统...') 324 return 325 try: 326 task[choice]() 327 except Exception as e: 328 print("出错,请重试....") 329 print('\n') 330 331 with open("user_info.txt", 'r', encoding='utf8') as f: 332 data_list = [] 333 for line in f: 334 data_list.append(line) 335 336 for line in data_list: 337 num = 1 338 339 # 用户信息列表 340 data = line.strip().split(",") 341 if ID == data[0]: # 判断 账号是否存在 342 if data[-1] == "1": 343 print('该账号已冻结,请联系管理员解冻') 344 return 345 346 # 密码错三次 账号冻结 347 while password != data[1] and num < 3: 348 num += 1 349 password = input("密码错误,请重试(第%s次尝试):" % num) 350 351 if ID == data[0] and password == data[1]: 352 353 print('"%s",登录成功\n' % ID) 354 client = Client(data) # 实例化一个客户类 把用户信息传进去 355 break # 跳出 for 循环 356 357 else: 358 self.dongjie(ID) 359 print("该账号'%s'已冻结,联系管理员解冻" % ID) 360 break # 跳出 for 循环 361 else: 362 print("账号'%s'不存在,请联系管理员" % ID) 363 364 if client != None: 365 task = {'1': client.chaxun, '2': client.qu, '3': client.cun, '4': client.zhuan, '5': client.xiugai} 366 menu = {'1': "查询余额", '2': "取款", '3': "存款", '4': "转账", '5': "修改个人密码", '6': '退出系统'} 367 while 1: 368 for k, v in menu.items(): 369 print(k, v) 370 371 choice = input("请输入你要执行的任务序号(默认为1):") 372 if choice == '6': 373 print('退出系统...') 374 return 375 try: 376 task[choice]() 377 except Exception as e: 378 print("出错,请重试...") 379 print('\n') 380 381 382 if __name__ == '__main__': 383 ATM().run() # 程序的入口