练习题
参考答案:http://www.cnblogs.com/alice-bj/p/8485985.html
- logging模块有几个日志级别?
-
请配置logging模块,使其在屏幕和文件里同时打印以下格式的日志
2017-10-18 15:56:26,613 - access - ERROR - account [1234] too many login attempts
-
json、pickle、shelve三个区别是什么?
- json的作用是什么?
- subprocess执行命令方法有几种?
- 为什么要设计好目录结构?
-
打印出命令行的第一个参数。例如:
python argument.py luffy 打印出 luffy
-
代码如下:
''' Linux当前目录/usr/local/nginx/html/ 文件名:index.html ''' import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(index.html))) print(BASE_DIR)
- 打印的内容是什么?
- os.path.dirname和os.path.abspath含义是什么?
-
通过configparser模块完成以下功能
文件名my.cnf
[DEFAULT] [client] port = 3306 socket = /data/mysql_3306/mysql.sock [mysqld] explicit_defaults_for_timestamp port = 3306 socket = /data/mysql_3306/mysql.sock back_log = 80 basedir = /usr/local/mysql tmpdir = /tmp datadir = /data/mysql_3306 default-time-zone = '+8:00'
- 修改时区 default-time-zone = '+8:00' 为 校准的全球时间 +00:00
- 删除 explicit_defaults_for_timestamp
- 为DEFAULT增加一条 character-set-server = utf8
-
写一个6位随机验证码程序(使用random模块),要求验证码中至少包含一个数字、一个小写字母、一个大写字母.
-
利用正则表达式提取到 luffycity.com ,内容如下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>luffycity.com</title> </head> <body> </body> </html>
-
写一个用户登录验证程序,文件如下
1234.json{"expire_date": "2021-01-01", "id": 1234, "status": 0, "pay_day": 22, "password": "abc"}
- 用户名为json文件名,密码为 password。
- 判断是否过期,与expire_date进行对比。
- 登陆成功后,打印“登陆成功”,三次登陆失败,status值改为1,并且锁定账号。
-
把第12题三次验证的密码进行hashlib加密处理。即:json文件保存为md5的值,然后用md5的值进行验证。
-
最近luffy买了个tesla,通过转账的形式,并且支付了5%的手续费,tesla价格为75万。文件为json,请用程序实现该转账行为。
需求如下:- 目录结构为
. ├── account │ ├── luffy.json │ └── tesla.json └── bin └── start.py
当执行start.py时,出现交互窗口
------- Luffy Bank --------- 1. 账户信息 2. 转账
- 选择1 账户信息 显示luffy的当前账户余额。
- 选择2 转账 直接扣掉75万和利息费用并且tesla账户增加75万
-
对上题增加一个需求:提现。
目录结构如下. ├── account │ └── luffy.json ├── bin │ └── start.py └── core └── withdraw.py
当执行start.py时,出现交互窗口
------- Luffy Bank --------- 1. 账户信息 2. 提现
- 选择1 账户信息 显示luffy的当前账户余额和信用额度。
- 选择2 提现 提现金额应小于等于信用额度,利息为5%,提现金额为用户自定义。
-
尝试把上一章的验证用户登陆的装饰器添加到提现和转账的功能上。
-
对第15题的用户转账、登录、提现操作均通过logging模块记录日志,日志文件位置如下
. ├── account │ └── luffy.json ├── bin │ └── start.py └── core | └── withdraw.py └── logs └── bank.log
答案
12、用户验证
# 用户名为json文件名,密码为 password。 # 判断是否过期,与expire_date进行对比。 # 登陆成功后,打印“登陆成功”,三次登陆失败,status值改为1,并且锁定账号。 # {"expire_date": "2021-01-01", "id": 1234, "status": 0, "pay_day": 22, "password": "abc"} import time import json import re # 取出用户名 json_name = '1234.json' username = re.split('.json$', json_name)[0] # 取出locker用户 f = open('locker', 'r') lockers = f.read() locker_list = lockers.split() f.close() # json数据 取出 密码、状态、过期时间 f = open(json_name, 'r') data = json.load(f) password = data['password'] expire_date = data['expire_date'] status = data['status'] # 过期时间转换格式 expire_date = time.strptime(expire_date, "%Y-%m-%d") expire_date = time.mktime(expire_date) now_date = time.time() count = 0 while True: _username = input('用户名:').strip() _password = input('密码:').strip() if _username not in locker_list: if username == _username and password == _password: if now_date < expire_date: print('welcome') else: print('密码过期') else: print('用户名或密码错误') else: print('用户名已经被锁定') count += 1 if count == 3: # 锁定用户 f = open('locker', 'a') f.write(_username+'\t') f.close() print('该用户已经被锁定') # status修改为0,写入json data['status'] = 1 f = open(json_name, 'w') json.dump(data, f) f.close() break
13、md5加密
import hashlib pwd_md5_1 = '202cb962ac59075b964b07152d234b70' print(pwd_md5_1) _password = input('密码:').strip() m = hashlib.md5() m.update(_password.encode()) pwd_md5 = m.hexdigest() print(pwd_md5) if pwd_md5_1 == pwd_md5: print('ok')
# 用户名为json文件名,密码为 password。 # 判断是否过期,与expire_date进行对比。 # 登陆成功后,打印“登陆成功”,三次登陆失败,status值改为1,并且锁定账号。 # 把第12题三次验证的密码进行hashlib加密处理。即:json文件保存为md5的值,然后用md5的值进行验证。 import time import json import re import hashlib # 取出用户名 json_name = '1234.json' username = re.split('.json$', json_name)[0] # 取出locker用户 f = open('locker', 'r') lockers = f.read() locker_list = lockers.split() f.close() # json数据 取出 密码、状态、过期时间 f = open(json_name, 'r') data = json.load(f) password = data['password'] expire_date = data['expire_date'] status = data['status'] # print(password) # 过期时间转换格式 expire_date = time.strptime(expire_date, "%Y-%m-%d") expire_date = time.mktime(expire_date) now_date = time.time() count = 0 while True: _username = input('用户名:').strip() _password = input('密码:').strip() # 密码的md5值 m = hashlib.md5() m.update(_password.encode()) pwd_md5 = m.hexdigest() if _username not in locker_list: if username == _username and password == pwd_md5: if now_date < expire_date: print('welcome') break else: print('密码过期') else: print('用户名或密码错误') else: print('用户名已经被锁定') count += 1 if count == 3: # 锁定用户 f = open('locker', 'a') f.write(_username + '\t') f.close() print('该用户已经被锁定') # status修改为0,写入json data['status'] = 1 f = open(json_name, 'w') json.dump(data, f) f.close() break
14、转账
# 最近luffy买了个tesla,通过转账的形式,并且支付了5%的手续费,tesla价格为75万。文件为json,请用程序实现该转账行为。 # 需求如下: # # 目录结构为 # . # ├── account # │ ├── luffy.json # │ └── tesla.json # └── bin # └── start.py # 当执行start.py时,出现交互窗口 # # ------- Luffy Bank --------- # 1. 账户信息 # 2. 转账 # 选择1 账户信息 显示luffy的当前账户余额。 # 选择2 转账 直接扣掉75万和利息费用并且tesla账户增加75万 import os import sys # 取出当前文件的父目录, print(__file__) BASE_DIR = os.path.abspath(__file__) print(BASE_DIR) BASE_DIR1 = os.path.dirname(BASE_DIR) print(BASE_DIR1) BASE_DIR2 = os.path.dirname(BASE_DIR1) print(BASE_DIR2) # 取出json文件的绝对路径 file_path1 = BASE_DIR2 + "\\" + "account" + "\\" + "luffy.json" file_path2 = BASE_DIR2 + "\\" + "account" + "\\" + "tesla.json" msg = """ ------- Luffy Bank --------- 1. 账户信息 2. 转账 """ print(msg) price = 75000 print(price) choice = int(input('>')) import json if choice == 1: f = open(file_path1, 'r') data = json.load(f) f.close() print('账户余额:', data) elif choice == 2: # tesla.json 文件操作 f = open(file_path2, 'r+') data = json.load(f) data += price f.seek(0) json.dump(data,f) f.close() fin_price = price *(1 + 5/100 ) print('你购买了tesla,花费了', fin_price) # luffy.json 文件操作 f = open(file_path1, 'r+') data = json.load(f) data -= price print('余额剩下', data) f.seek(0) json.dump(data, f) f.close()
15、提现
# 最近luffy买了个tesla,通过转账的形式,并且支付了5%的手续费,tesla价格为75万。文件为json,请用程序实现该转账行为。 # 需求如下: # # 目录结构为 # . # ├── account # │ ├── luffy.json # │ └── tesla.json # └── bin # └── start.py # 当执行start.py时,出现交互窗口 # # ------- Luffy Bank --------- # 1. 账户信息 # 2. 转账 # 选择1 账户信息 显示luffy的当前账户余额。 # 选择2 转账 直接扣掉75万和利息费用并且tesla账户增加75万 # 对上题增加一个需求:提现。 # 目录结构如下 # # . # ├── account # │ └── luffy.json # ├── bin # │ └── start.py # └── core # └── withdraw.py # 当执行start.py时,出现交互窗口 # # ------- Luffy Bank --------- # 1. 账户信息 # 2. 提现 # 选择1 账户信息 显示luffy的当前账户余额和信用额度。 # 选择2 提现 提现金额应小于等于信用额度,利息为5%,提现金额为用户自定义。 import os import sys import json # 取出当前文件的父目录, print(__file__) BASE_DIR = os.path.abspath(__file__) print(BASE_DIR) BASE_DIR1 = os.path.dirname(BASE_DIR) print(BASE_DIR1) BASE_DIR2 = os.path.dirname(BASE_DIR1) print(BASE_DIR2) # 跨模块导入,绝对路径 sys.path.append(BASE_DIR2) print(sys.path) # 取出json文件的绝对路径 file_path1 = BASE_DIR2 + "\\" + "account" + "\\" + "luffy.json" file_path2 = BASE_DIR2 + "\\" + "account" + "\\" + "tesla.json" file_path3 = BASE_DIR2 + "\\" + "account" + "\\" + "account.json" msg = """ ------- Luffy Bank --------- 1. 账户信息 2. 转账 3. 提现 """ print(msg) price = 75000 print(price) choice = int(input('>')) f = open(file_path3, 'r') data = json.load(f) f.close() if choice == 1: print('账户余额', data['account']) print('信用额度', data['credit']) elif choice == 2: # tesla.json 文件操作 f = open(file_path2, 'r+') data = json.load(f) data += price f.seek(0) json.dump(data,f) f.close() fin_price = price *(1 + 5/100 ) print('你购买了tesla,花费了', fin_price) # luffy.json 文件操作 f = open(file_path1, 'r+') data = json.load(f) data -= price print('余额剩下', data) f.seek(0) json.dump(data, f) f.close() elif choice == 3: from core import withdraw withdraw.takeout()
# withdraw 文件 def takeout(): import os import json # 取出当前文件的父目录, print(__file__) BASE_DIR = os.path.abspath(__file__) print(BASE_DIR) BASE_DIR1 = os.path.dirname(BASE_DIR) print(BASE_DIR1) BASE_DIR2 = os.path.dirname(BASE_DIR1) print(BASE_DIR2) # 取出json文件的绝对路径 file_path1 = BASE_DIR2 + "\\" + "account" + "\\" + "luffy.json" file_path2 = BASE_DIR2 + "\\" + "account" + "\\" + "tesla.json" file_path3 = BASE_DIR2 + "\\" + "account" + "\\" + "account.json" withdraw_price = input('请输入提现金额>') withdraw_price = int(withdraw_price) f = open(file_path3, 'r') data = json.load(f) f.close() if withdraw_price <= data['credit']: cost_price = withdraw_price * (1 + 5 / 100) print('取出了', withdraw_price) data['account'] -= cost_price # 写入账户余额json f = open(file_path3, 'w') json.dump(data, f) f.close()
16、登录装饰器
import os import sys import json # 取出当前文件的父目录, print(__file__) BASE_DIR = os.path.abspath(__file__) print(BASE_DIR) BASE_DIR1 = os.path.dirname(BASE_DIR) print(BASE_DIR1) BASE_DIR2 = os.path.dirname(BASE_DIR1) print(BASE_DIR2) # 跨模块导入,绝对路径 sys.path.append(BASE_DIR2) print(sys.path) # 取出json文件的绝对路径 file_path1 = BASE_DIR2 + "\\" + "account" + "\\" + "luffy.json" file_path2 = BASE_DIR2 + "\\" + "account" + "\\" + "tesla.json" file_path3 = BASE_DIR2 + "\\" + "account" + "\\" + "account.json" user_status = False def login(fun): def inner(*args, **kwargs): # 可变参数 _username = "alex" _password = "123" global user_status if user_status == False: username = input("user:") password = input("pasword:") if username == _username and password == _password: print("welcome login....") user_status = True else: print("wrong username or password!") if user_status == True: fun(*args, **kwargs) # 可变参数 return inner @login def transfer(): # tesla.json 文件操作 f = open(file_path2, 'r+') data = json.load(f) data += price f.seek(0) json.dump(data,f) f.close() fin_price = price *(1 + 5/100 ) print('你购买了tesla,花费了', fin_price) # luffy.json 文件操作 f = open(file_path1, 'r+') data = json.load(f) data -= price print('余额剩下', data) f.seek(0) json.dump(data, f) f.close() msg = """ ------- Luffy Bank --------- 1. 账户信息 2. 转账 3. 提现 """ print(msg) price = 75000 print(price) choice = int(input('>')) if choice == 1: f = open(file_path3, 'r') data = json.load(f) f.close() print('账户余额', data['account']) print('信用额度', data['credit']) elif choice == 2: transfer() elif choice == 3: from core import withdraw withdraw.takeout()
user_status = False def login(fun): def inner(*args, **kwargs): # 可变参数 _username = "alex" _password = "123" global user_status if user_status == False: username = input("user:") password = input("pasword:") if username == _username and password == _password: print("welcome login....") user_status = True else: print("wrong username or password!") if user_status == True: fun(*args, **kwargs) # 可变参数 return inner @login def takeout(): import os import json # 取出当前文件的父目录, print(__file__) BASE_DIR = os.path.abspath(__file__) print(BASE_DIR) BASE_DIR1 = os.path.dirname(BASE_DIR) print(BASE_DIR1) BASE_DIR2 = os.path.dirname(BASE_DIR1) print(BASE_DIR2) # 取出json文件的绝对路径 file_path1 = BASE_DIR2 + "\\" + "account" + "\\" + "luffy.json" file_path2 = BASE_DIR2 + "\\" + "account" + "\\" + "tesla.json" file_path3 = BASE_DIR2 + "\\" + "account" + "\\" + "account.json" withdraw_price = input('请输入提现金额>') withdraw_price = int(withdraw_price) f = open(file_path3, 'r') data = json.load(f) f.close() if withdraw_price <= data['credit']: cost_price = withdraw_price * (1 + 5 / 100) print('取出了', withdraw_price) data['account'] -= cost_price # 写入账户余额json f = open(file_path3, 'w') json.dump(data, f) f.close()
17、日志
import os import sys import json # 取出当前文件的父目录, print(__file__) BASE_DIR = os.path.abspath(__file__) print(BASE_DIR) BASE_DIR1 = os.path.dirname(BASE_DIR) print(BASE_DIR1) BASE_DIR2 = os.path.dirname(BASE_DIR1) print(BASE_DIR2) # 跨模块导入,绝对路径 sys.path.append(BASE_DIR2) print(sys.path) # 取出json文件的绝对路径 file_path1 = BASE_DIR2 + "\\" + "account" + "\\" + "luffy.json" file_path2 = BASE_DIR2 + "\\" + "account" + "\\" + "tesla.json" file_path3 = BASE_DIR2 + "\\" + "account" + "\\" + "account.json" file_path4 = BASE_DIR2 + "\\" + "logs" + "\\" + "bank.log" # 日志 import logging logger = logging.getLogger('web') logger.setLevel(logging.DEBUG) file_log = logging.FileHandler(file_path4) logger.addHandler(file_log) file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') file_log.setFormatter(file_formatter) user_status = False def login(fun): def inner(*args, **kwargs): # 可变参数 _username = "alex" _password = "123" global user_status if user_status == False: username = input("user:") password = input("pasword:") if username == _username and password == _password: print("welcome login....") user_status = True else: print("wrong username or password!") if user_status == True: fun(*args, **kwargs) # 可变参数 return inner @login def transfer(): # tesla.json 文件操作 f = open(file_path2, 'r+') data = json.load(f) data += price f.seek(0) json.dump(data,f) f.close() fin_price = price *(1 + 5/100 ) print('你购买了tesla,花费了', fin_price) # luffy.json 文件操作 f = open(file_path1, 'r+') data = json.load(f) data -= price print('余额剩下', data) f.seek(0) json.dump(data, f) f.close() msg = """ ------- Luffy Bank --------- 1. 账户信息 2. 转账 3. 提现 """ print(msg) logger.debug('start ... ') logger.debug('print menu') price = 75000 print(price) choice = int(input('>')) logger.debug('enter choice') if choice == 1: logger.debug('select account ') f = open(file_path3, 'r') data = json.load(f) f.close() print('账户余额', data['account']) print('信用额度', data['credit']) elif choice == 2: logger.debug('transform bill ') transfer() elif choice == 3: from core import withdraw logger.debug('withdraw bill ') withdraw.takeout()